Help VB -> PB

Раздел посвящен программированию с использованием Power Basic.
pb0m
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 06.05.2007 (Вс) 0:11

Help VB -> PB

Сообщение pb0m » 23.07.2007 (Пн) 20:55

Никак не получается перевести данный код с VB6 на PB8 :(
Вместо русских (да и английских тоже) букв - иероглифы.
Подскажите, плиз, что здесь не так.
Код VB6:
Код: Выделить всё

Option Explicit

Private Type MSGBOXPARAMS
    cbSize As Long
    hwndOwner As Long
    hInstance As Long
    lpszText As Long
    lpszCaption As Long
    dwStyle As Long
    lpszIcon As Long
    dwContextHelpId As Long
    lpfnMsgBoxCallback As Long
    dwLanguageId As Long
End Type

Private Type MSGBOXDATA
    params As MSGBOXPARAMS
    pwndOwner As Long
    wLanguageId As Integer
    pidButton As Long '                 // Array of button IDs
    ppszButtonText As Long '            // Array of button text strings
    cButtons As Long
    DefButton As Long
    CancelId As Long
    Timeout As Long
End Type

Private Declare Function SoftModalMessageBox Lib "user32" (pMsgBoxParams As MSGBOXDATA) As Long

Sub Main()
Dim mbd As MSGBOXDATA, Buttons(3) As Long, Captions(3) As String
    Captions(0) = "Нафиг"
    Buttons(0) = vbAbort
    Captions(1) = "Нефиг"
    Buttons(1) = vbRetry
    Captions(2) = "Пофиг"
    Buttons(2) = vbIgnore
    Captions(3) = "Отмена"
    Buttons(3) = vbCancel
With mbd
    With .params
        .cbSize = LenB(mbd.params)
        .lpszText = StrPtr(Replace("Чтобы сделать месседжбокс с собственными подписями\nкнопок, совсем не обязательно рисовать форму самому:\nдля этого идеально подходит малодокументированная\nфункция SoftModalMessageBox.", "\n", vbCrLf))
        .lpszCaption = StrPtr("Круто, да?")
        MsgBox .lpszCaption
        .dwStyle = vbQuestion & vbOKCancel
    End With
    .DefButton = 2
    .CancelId = vbCancel
    .cButtons = 4
    .pidButton = VarPtr(Buttons(0))
    .ppszButtonText = VarPtr(Captions(0))
    .Timeout = -1
End With
Debug.Print SoftModalMessageBox(mbd)
End Sub


Код PB8:
Код: Выделить всё

#Compile Exe
#Dim All
#Include "Win32API.inc"

Type MSGBOXDATA
    params As MSGBOXPARAMS
    pwndOwner As Dword
    wLanguageId As Dword
    pidButton As Dword
    ppszButtonText As Dword
    cButtons As Dword
    DefButton As Dword
    CancelId As Dword
    TimeOut As Dword
End Type
Declare Function SoftModalMessageBox Lib "USER32.DLL" Alias "SoftModalMessageBox" (pMsgBoxParams As MSGBOXDATA) As Long
Function PBMain () As Long

Local mbd As MSGBOXDATA, Buttons() As Long, Captions() As String,s As String, c As String
ReDim Captions(3)
ReDim Buttons(3)
    Captions(0) = ("Нафиг")
    Buttons(0) = 3
    Captions(1) = ("Нефиг")
    Buttons(1) = 4
    Captions(2) = ("Пофиг")
    Buttons(2) = 5
   Captions(3) = ("Отмена")
    Buttons(3) = 2
s="Чтобы сделать месседжбокс"
c="Caption"


mbd.params.dwLanguageId=1049
mbd.wLanguageId =1049
mbd.params.cbSize = Len(mbd.params)
mbd.params.lpszText =StrPtr(s$)
mbd.params.lpszCaption = StrPtr(c$)
mbd.params.dwStyle = 32+1

mbd.DefButton = 2
mbd.CancelId = 2
mbd.cButtons = 4
mbd.pidButton = VarPtr(Buttons(0))
mbd.ppszButtonText =VarPtr(Captions(0))
mbd.Timeout = -1
SoftModalMessageBox mbd

End Function


keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 23.07.2007 (Пн) 22:49

И не получится, потому что PB не поддерживает юникод, а функция по ходу неюникодного варианта не имеет. Единственный выход - делать MultiByteToWideChar из строки в байтовый массив и передавать ссылку на него.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 23.07.2007 (Пн) 23:25

keks-n писал(а):И не получится, потому что PB не поддерживает юникод, а функция по ходу неюникодного варианта не имеет.


А функции ACODE$ и UCODE$ тогда зачем?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 24.07.2007 (Вт) 0:26

jangle
А потом с ними можно работать как с обычными строками?
Изображение

pb0m
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 06.05.2007 (Вс) 0:11

Сообщение pb0m » 24.07.2007 (Вт) 2:27

Большое спасибо :!: :D
А ACODE$ и UCODE$ - вообще шикарно 8) Даже не знал что в PB такие ф-ии имеются.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 24.07.2007 (Вт) 8:51

keks-n писал(а):jangle
А потом с ними можно работать как с обычными строками?


Да конечно, вот доработанный пример от pb0m

Код: Выделить всё
#Compile Exe
#Dim All
#Include "Win32API.inc"

Type MSGBOXDATA
params As MSGBOXPARAMS
pwndOwner As Dword
wLanguageId As Dword
pidButton As Dword
ppszButtonText As Dword
cButtons As Dword
DefButton As Dword
CancelId As Dword
TimeOut As Dword
End Type
Declare Function SoftModalMessageBox Lib "USER32.DLL" Alias "SoftModalMessageBox" (pMsgBoxParams As MSGBOXDATA) As Long
Function PBMain () As Long

Local mbd As MSGBOXDATA, Buttons() As Long, Captions() As String,s As String, c As String
ReDim Captions(3)
ReDim Buttons(3)
Captions(0) = UCode$("Нафиг")
Buttons(0) = 3
Captions(1) = UCode$("Нефиг")
Buttons(1) = 4
Captions(2) = UCode$("Пофиг")
Buttons(2) = 5
Captions(3) = UCode$("Отмена")
Buttons(3) = 2
s=UCode$("Чтобы сделать месседжбокс")
c=UCode$("Caption")


mbd.params.dwLanguageId=1049
mbd.wLanguageId =1049
mbd.params.cbSize = Len(mbd.params)
mbd.params.lpszText =StrPtr(s$)
mbd.params.lpszCaption = StrPtr(c$)
mbd.params.dwStyle = 32+1

mbd.DefButton = 2
mbd.CancelId = 2
mbd.cButtons = 4
mbd.pidButton = VarPtr(Buttons(0))
mbd.ppszButtonText =VarPtr(Captions(0))
mbd.Timeout = -1
SoftModalMessageBox mbd

End Function

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Сообщение PBDN » 26.07.2007 (Чт) 19:52

keks-n писал(а):jangle
А потом с ними можно работать как с обычными строками?


Не совсем, перевести то они переведут, но только базируясь на локальных региональных установках. Если на машине будет установлена к примеру английская локаль, то толку от UCODE и ACODE маловато.
При переводе русских букв будет каша.
К тому же переведенная в Юникод строка не подлежит обработке обалденными стринговыми операторами Verivy, Tally, MID, INSTR, TRIM, REMOVE, REPLACE .... и многими другими. К сожалению ПБ не могут понять что юникод это не просто два байта, а еще и первый параметр MultiByteToWideChar который в ACODE и UCODE заменен пожизни на дефолтовое значение установленной локали.
Для того чтобы без геммороя работать в ПБ с юникодом, самый простой вариант создавать все в ресурсах, строки , диалоги, ресурсы и загружать юникодовой АПИ DialogBoxParam диалоги и контролы одновременно а строки LoadString. Соотвественно нужно корректировать win32api.inc по всем используемым АПИ на юникодовые варианты(где то в дебрях ПБ-форума есть уже переведенный вариант win32api.)
Создавать диалоги и контролы можно не хуже, а в чем то(редактирование внешнего вида программы не портит исходников как в ПБформ) даже лучше ресурс редактором http://www.assembler.ca/radasm/projects/ResEd.zip
в этом случае получается нормальная юникодовое приложение которое будет нормально отображать национальные шрифты на любой машине в мире. В соурсе-коде форума ПБ есть где то полное работоспособное юникодовое приложение- RuKbdUni как образец. Единственный недостаток потеря работоспособности вышеописанных стринговых операторов с юникодовыми строками:( Хотя можно конечно конвертировать нормально АПИшками туда сюда, но ... будем надеяться что в ПБ поймут что кроме английского есть еще куча языков и поддержка ОСью юникода сделана не с проста.
Честно говоря жалко ПБ, классный компилер, на коленке быстро, просто и надежно можно слепить маленькое , шустрое приложение, но отсутствие некоторых ключевых фич тянет его на дно :(

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 26.07.2007 (Чт) 23:41

К сожалению ПБ не могут понять что юникод это не просто два байта, а еще и первый параметр MultiByteToWideChar который в ACODE и UCODE заменен пожизни на дефолтовое значение установленной локали.

StrPtr-то для юникодной строки работает? Если да, то передаём его в MultiByteToWideChar(с поправленной декларацией) - получаем русские буквы под любой локалью.
Изображение

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Сообщение PBDN » 27.07.2007 (Пт) 1:12

keks-n писал(а):StrPtr-то для юникодной строки работает? Если да, то передаём его в MultiByteToWideChar(с поправленной декларацией) - получаем русские буквы под любой локалью.


Так в том то и дело что через MultiByteToWideChar и (с поправленной декларацией) а не через ACODE, UCODE
и каждый раз когда нужен один из описанных выше стринговых операторов, приходятся гонять строки в АНСИ а потом обратно, или вообще писать свои юникоде-аналоги стриговых функций.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 27.07.2007 (Пт) 9:07

PBDN писал(а):Не совсем, перевести то они переведут, но только базируясь на локальных региональных установках. Если на машине будет установлена к примеру английская локаль, то толку от UCODE и ACODE маловато. При переводе русских букв будет каша.


У меня дома, на одном из дисков, стоит английская версия Win2000, все переводит нормально, никакой каши нет.

К тому же переведенная в Юникод строка не подлежит обработке обалденными стринговыми операторами Verivy, Tally, MID, INSTR, TRIM, REMOVE, REPLACE .... и многими другими.


Определи макросы для Unicode вариантов строковых функций, например:

Код: Выделить всё
Macro MidW(prm1,prm2,prm3)=UCode$(Mid$(ACode$(prm1),prm2,prm3))       


Cложи макросы в отдельный файл, UnicodeStr.Inc, и подключай его к проекту, и будет тебе счастие. Все нормально работает, вот пример:

Код: Выделить всё
#Compile Exe
#Dim All

Macro MidW(prm1,prm2,prm3)=UCode$(Mid$(ACode$(prm1),prm2,prm3))     

Function PBMain () As Long
    Dim UnicodeString As String
    UnicodeString=UCode$("hello!")
    UnicodeString=MidW(UnicodeString,1,2)
    MsgBox UnicodeString
End Function

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Сообщение PBDN » 27.07.2007 (Пт) 19:43

jangle писал(а):
PBDN писал(а):Не совсем, перевести то они переведут, но только базируясь на локальных региональных установках. Если на машине будет установлена к примеру английская локаль, то толку от UCODE и ACODE маловато. При переводе русских букв будет каша.


У меня дома, на одном из дисков, стоит английская версия Win2000, все переводит нормально, никакой каши нет.


jangle, читаем еще раз внимательно, -английская локаль.
установите на вашей W2K английские региональные установки, или французскую, немецкую, любую но не русскую и выполните вот такой код
Код: Выделить всё
#COMPILE EXE
#DIM ALL

DECLARE FUNCTION MessageBoxU LIB "USER32.DLL" ALIAS "MessageBoxW" (BYVAL hWnd AS DWORD, lpText AS ASCIIZ, lpCaption AS ASCIIZ, BYVAL dwType AS DWORD) AS LONG

FUNCTION PBMAIN () AS LONG
    MessageBoxU(0,UCODE$("hello! Привет!"),BYVAL 0,48)
END FUNCTION


Теперь видите вместо "Привет" иероглифы ?

А теперь представте что вашу программу покупают во всем мире и надеются увидеть русские буквы. Писать сопроводиловку, ребят так мол и так, хотите видеть русские буквы, меняйте локаль на русскую и перегружайтесь.
Весь смысл юникода в том что он не зависим от локальных региональных установок и может быть корректно воспроизведен на машине с любой локалью, но для этого замаскированный под UCODE$
MultiByteToWideChar должен иметь еще один параметр - локаль, (или проще говоря -первый параметр MultiByteToWideChar) который в UCODE по жизни установлен в CP_ACP, вместо того чтобы давать возможность указать конкретный анси-шрифт (1251 в случае для русского языка)

Определи макросы для Unicode вариантов строковых функций, например:

Код: Выделить всё
Macro MidW(prm1,prm2,prm3)=UCode$(Mid$(ACode$(prm1),prm2,prm3))       


Cложи макросы в отдельный файл, UnicodeStr.Inc, и подключай его к проекту, и будет тебе счастие.


Да не получится "счастья" если локаль на машине будет не русская, по причине того что описано выше. Конечно можно написать свой макрос, используя MultiByteToWideChar и WideCharToMultiByte,
но как то это криво выглядит, для того чтобы сделать что то с юникодовой строкой прийдется гонять дважды перекодировку.
Главное достоинство ПБ - скорость, а изврат с постоянными перекодировками туда-сюда убьет это достоинство как миниум вдвое.


Все нормально работает, вот пример:

Код: Выделить всё
#Compile Exe
#Dim All

Macro MidW(prm1,prm2,prm3)=UCode$(Mid$(ACode$(prm1),prm2,prm3))     

Function PBMain () As Long
    Dim UnicodeString As String
    UnicodeString=UCode$("hello!")
    UnicodeString=MidW(UnicodeString,1,2)
    MsgBox UnicodeString '<----------------------------
End Function


Нормально это к сожалению не может работать в принципе, т.к. Вы используете ПБ-шный MsgBox который работает с АНСИ строками, а вы подсовываете ему юникодовую строку, в результате чего MSGBOX загнется на первом же нуле который встретится в юникодовой строке, а как вы знаете нулей в юникодовой строке может быть... много.

Ок. Представим что наше приложение тихоходное и не требует большого количества обработки строк, напишем свои макросы-аналоги ACODE, UCODE реализующие корректную работу с использованием первого параметра MultiByteToWideChar и будем гонять строки в АНСИ и обратно только для того чтобы сделать какие то телодвижения с юникодовой строкой. Фиг с ней со скоростью.
Как отобразить КОРРЕКТНО юникодовую строку содержащую к примеру русский текст на любой машине в мире(т.е. с разными установленными локалями) ?
Это возможно ТОЛЬКО в том случае , если контрол(диалог) в который мы выводим юникодовый текст тоже ДОЛЖЕН быть юникодовым.
При использовании DDT это не реализуемо, т.к. ПБ создает только АНСИ контролы и диалоги.
Вот и вся загвоздка. ПБ заточен в стиле вин98, хочется корректно отображать национальные символы, - меняй локаль и перегружайся, или пиши приложение только как англоязычное.
Выход есть как я уже говорил, т.к ПБ не что иное как офигенный врапер ассемблера, можно самому создавать контролы и диалоги в ресурсе(который по своей натуре -всегда юникодовый) и использовать юникодовые АПИ для создание диалогов и контролов средствами SDK, но ... перелопачивать весь win32api корректируя "A" на "W" на конце названия функции каждого АПИ....
Грустно короче.

Хотелось бы видеть ПБ идущий в ногу со временем, а не с 10 летним отставанием от реальности. Язык действительно классный(jangle, и люблю его я не меньше вас), при гораздо меньших телодвижениях по сравнению с дельфи и тем более С++, можно создать шустрое и маленькое приложение. Но беда в том, если компилятор не будет поддерживать нативно (а не через Ж) мультиязычность, то продукт не будет иметь популярности, а значит доходов от продаж не будет хватать на дальнейшее развитие языка, что в первую очередь и волнует.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 30.07.2007 (Пн) 10:31

jangle, читаем еще раз внимательно, -английская локаль.
установите на вашей W2K английские региональные установки, или французскую, немецкую, любую но не русскую и выполните вот такой код


Установил английскую локаль, самое интересное, после этого все русскоязычные программы (за исключением Word, Excel) стали отображать кракозяблики. Видимо это проблема не только PB, а в общем характерна для всего неанглоязычного софта.

Главное достоинство ПБ - скорость, а изврат с постоянными перекодировками туда-сюда убьет это достоинство как миниум вдвое.


Ну в VB же народ как-то живет, там все текстовые строки хранятся в Unicode. При вызове любой API функции, виртуальная машина перекодирует их ANSI, даже если вызывается Unicode-вариант API функции, благо система распознает такой случай, и сама перекодирует ANSI обратно в Unicode.
Это отчасти объясняет почему программы на VB так медленно работают, цепь бессмысленных перекодировок строк сильно тормозит скорость работы.

Хотелось бы видеть ПБ идущий в ногу со временем, а не с 10 летним отставанием от реальности. Язык действительно классный(jangle, и люблю его я не меньше вас), при гораздо меньших телодвижениях по сравнению с дельфи и тем более С++, можно создать шустрое и маленькое приложение. Но беда в том, если компилятор не будет поддерживать нативно (а не через Ж) мультиязычность, то продукт не будет иметь популярности, а значит доходов от продаж не будет хватать на дальнейшее развитие языка, что в первую очередь и волнует.


Лично для меня, достаточно поддержки только английского языка, благо что 95% процентов моих юзеров смогут разобратся с пунктами меню File, Open, SaveAs, Exit и т.д.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 30.07.2007 (Пн) 12:13

Ну в VB же народ как-то живет, там все текстовые строки хранятся в Unicode. При вызове любой API функции, виртуальная машина перекодирует их ANSI, даже если вызывается Unicode-вариант API функции, благо система распознает такой случай, и сама перекодирует ANSI обратно в Unicode.

Декларация ByVal As Long (Вместо As String) и передача StrPtr рулят. А если использовать те функции работы с юникодным текстом, что были доступны в Win9x, то проблема кракозябров исчезает совсем.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.07.2007 (Пн) 13:39

jangle писал(а):стали отображать кракозяблики. Видимо это проблема не только PB, а в общем характерна для всего неанглоязычного софта

Ты не прочитал то, что тебе написали. А тебе написали, что дело исключительно в том, что используются неюникодные контролы, и ни в чём другом.
И дело не в языковости софта, а в том, какие контролы автор выбрал для его написания. PB не позволяет использовать юникодные контролы? Значит результата не будет.

jangle писал(а):благо система распознает такой случай, и сама перекодирует ANSI обратно в Unicode.

Это не так.

jangle писал(а):Это отчасти объясняет почему программы на VB так медленно работают, цепь бессмысленных перекодировок строк сильно тормозит скорость работы

И это не так.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

PBDN
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2006 (Сб) 22:10

Сообщение PBDN » 30.07.2007 (Пн) 18:32

Установил английскую локаль, самое интересное, после этого все русскоязычные программы (за исключением Word, Excel) стали отображать кракозяблики. Видимо это проблема не только PB, а в общем характерна для всего неанглоязычного софта.


Эта проблема характерна только для софта, котороые писали
програмисты не понимающие что есть такое юникодовая поддержка.
Если выводить юникодовый текст в АНСИ контрол(диалог) то толку от юникода - ноль, т.к. ОСь на лету переконвертирует текст обратно в АНСИ в соответствии с текущей локалью.
Возьмите ВинСпай, например этот http://www.catch22.net/software/zips/WinSpy.zip
и иследуйте те программы которые выводят крякозяблы, и вы обнаружите что контролы(диалоги) есть ANSI. А теперь сгрузите ту ПБ-шную програмку о которой я говорил выше RuKbdUni, и запускайте ее смело под любой локалью, на любой машине с любой локалью будет корректно отображаться русский текс, потому что контролы И текст - юникодовые.

Лично для меня, достаточно поддержки только английского языка, благо что 95% процентов моих юзеров смогут разобратся с пунктами меню File, Open, SaveAs, Exit и т.д.

Вот точно так же рассуждают многие и на ПБ-форуме, но языковая проблема - это в первую очередь распространяемость компилятора по всему миру, и устоявшийся стандарт для мультиязыковой поддержки.
С помощью юникода можно поддерживать не только национальные шрифты, но и делать программу одновременно поддерживающую несколько языков. У меня была одна маленькая задачка для брокеров, где одновременно в программе нужно было выводить данные сразу в пяти языках и независимо от локали компов.
Единственно правильное решение задачи - юникодовое приложение.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 30.07.2007 (Пн) 19:37

GSerg писал(а):
jangle писал(а):Это отчасти объясняет почему программы на VB так медленно работают, цепь бессмысленных перекодировок строк сильно тормозит скорость работы

И это не так.


Cо своей стороны, могу сослаться на книгу Стивена Романа, "Программирование в Win32 API на Visual Basic", глава "Преобразование строк в VB", стр. 105.
Там подробно описан механизм передачи BSTR строк, во внешние DLL функции. А именно преобразование Unicode строк в ANSI при передачи во внешнюю функцию, и обратно, при получении строк из DLL. Это сделано для совместимости VB с Win95/98/ME, т.к. эти операционки не поддерживают Unicode. В NT VB тоже преобразует строки в ANSI, выполняя тем самым совершенно бесполезную работу.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.07.2007 (Пн) 19:47

Не так не то, что VB их конвертирует. Не так именно то, что я процитировал. Особенно начиная с "программы на VB так медленно работают".
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 30.07.2007 (Пн) 22:01

jangle
Так происходит из-за того что такой способ является дефолтным. Как передать без заморочек с конвертацией юникодную строку я уже говорил. А по поводу неподдержки юникода в 9x - это не так: она там ограничена, но присутствует. В частности TextOut и ExtTextOut там есть, с полным списком можно ознакомиться в MSDN.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 31.07.2007 (Вт) 9:09

А по поводу неподдержки юникода в 9x - это не так: она там ограничена, но присутствует. В частности TextOut и ExtTextOut там есть, с полным списком можно ознакомиться в MSDN.


Ну если уже говорит совсем откровенно, Unicode можно использовать в 9x, но для этого надо таскать со своим дистрибутивом "Microsoft Layer for Unicode on Win9x Systems (MSLU)". Я так и делал, когда писал программу использующую Unicode API для Win98

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 31.07.2007 (Вт) 23:08

Microsoft Layer for Unicode on Win9x Systems (MSLU)

Этот layer - гадость редкостная, т. к. он просто делает подмену юникодных функций(которые экспортируются системными dll, но не работают) на свои, которые тупа конвертируют в ANSI.

З. Ы. Возможно, это не так, но мнение основано на поверхностном изучении документации.
Изображение


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList