Работа с DLL. Строковые переменные

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
MSpirit
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 28.05.2003 (Ср) 4:10

Работа с DLL. Строковые переменные

Сообщение MSpirit » 28.05.2003 (Ср) 4:18

Товарищи, есть DLL для работы со спец. БД.
ТАк вот, есть функция чтения полей.

Declare Function IsisRecSubField Lib "isis32.dll" (ByVal Handle&, ByVal Index&, ByVal Tag&, ByVal FldOcc&, ByVal SubField$, ByVal SubFieldArea$, ByVal AreaSize&) As Long

В нее в качестве строкового параметра передается параметр SubFieldArea$. ТАк вот, не изменяет эта функция его, как ни парься.

В доках на DLL написано, что для дельфи этот параметр должен иметь тип PChar (практически массив байтов). Для VB непонятно какой тип должон быть. Пробую строковую переменную - ничего, пробую байтовую - тоже, массив байтов - тож самое.

Помогите, неужели придется на Дельфи делать.

Александр Андреев
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 145
Зарегистрирован: 09.04.2003 (Ср) 16:43
Откуда: Н.Новгород

Сообщение Александр Андреев » 28.05.2003 (Ср) 11:53

А там есть проблема одна... точно не помню, но кажется DLL использует иное адресное пространство, нежели программа, которая с ней работает. Отсюда всякие заморочки...

MSpirit
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 28.05.2003 (Ср) 4:10

Сообщение MSpirit » 29.05.2003 (Чт) 3:05

И чего, как с этим бороться?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.05.2003 (Чт) 9:33

VB6 всегда хранит строки как Unicode. А API-функции ты декларируешь скорее всего, как ANSI
Пример:

Декларация ANSI:
Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String) As Long

Декларация Unicode:
Declare Function SetWindowText Lib "user32" Alias "SetWindowTextW" (ByVal hWnd As Long, ByVal lpString As String) As Long

Т.е. используй Unicode-декларацию (в системах с ядром NT почти все функции имеют два варианта, ANSI и Unicode).

Если же ты собрался использовать ANSI, то объявляй аргументы не как String, а как Long (указатель на строку), а саму строку вначале преобразуй из Unicode в ANSI, например так:
Код: Выделить всё
Declare Function SetWindowText Lib "user32" Alias "[color=red]SetWindowTextA[/color]" (ByVal hWnd As Long, ByVal lpString As Long) As Long
...
Dim txt As String, B() As Byte
txt = ...
B=StrConv(txt, vbFromUnicode)
SetWindowText Me.hWnd, B
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот и гости: 28

    TopList  
cron