Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Получить внутри VB функции строку из null-terminated строки / 8 сообщений из 8, страница 1 из 1
13.02.2008, 18:13
    #35130948
Sergey Kasatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
Необходимо из C++ проги вызвать функцию, которая находится в VB'шной dll. Прототип этой функции (в терминах С++) таков:

void VBfoo(char* strData);

При вызове VBfoo параметр strData указывает на некий буфер, содержащий null-terminated строку.

Проблемы:
а) как описать эту функцию на VB;
б) как переданные данные через strData переделать к типу VB String.

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

Я честно искал по форуму и тынтету. Но мне попадались только "обратные случаи", когда в VB выделается буфер и уже он заполняется внешней функцией.

Подскажите, плиз, кто синтаксис VB знает.
...
Рейтинг: 0 / 0
13.02.2008, 18:29
    #35130996
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
Sergey KasatkinПри вызове VBfoo параметр strData указывает на некий буфер, содержащий null-terminated строку.Не существует null-terminated строк. Это такой же нонсенс как край земли с которого путешественники падают. В Си и С++ строки называются zero-terminated.

Sergey Kasatkinа) как описать эту функцию на VB;
Код: plaintext
Sub VBfoo(ByRef strData as String)

Sergey Kasatkinб) как переданные данные через strData переделать к типу VB String.
Не нужно. Они и так одинаковые.

Sergey KasatkinЯ честно искал по форуму и тынтету. Но мне попадались только "обратные случаи", когда в VB выделается буфер и уже он заполняется внешней функцией.Потому что "обратные" случаи имеют больше смысла :)
...
Рейтинг: 0 / 0
13.02.2008, 18:46
    #35131036
Sergey Kasatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
White OwlНе существует null-terminated строк. Это такой же нонсенс как край земли с которого путешественники падают.
Надо в MS про это написать. А то позорятся своим MSDN на весь мир, аж стыдно за них.

White Owl
Код: plaintext
Sub VBfoo(ByRef strData as String)
[Преобразовывать] Не нужно. Они и так одинаковые.
Терзают меня смутные сомнения, признаться, но попробую. Спасибо.
...
Рейтинг: 0 / 0
14.02.2008, 11:48
    #35132185
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
Sergey Kasatkin White Owl
Код: plaintext
Sub VBfoo(ByRef strData as String)
[Преобразовывать] Не нужно. Они и так одинаковые.
Терзают меня смутные сомнения, признаться, но попробую. Спасибо.

Зря терзают. Только в терминах VB Sub - это процедура, а не функция, так как не возвращает значения. А ByRef означает что в качестве параметра передается указатель (не null-terminated!) - обрезать строку ее по null придется Вам.

Для большего понимания попробуйте разобраться как это дело работает:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Explicit

Public Sub Main()
    Dim s As String
    
    VBfoo "Test Null" & vbNullChar & "String"
    
    Debug.Print Len(s), s
End Sub

Sub VBfoo(ByRef ss As String)
    Dim i As Long, s As String
    
    Debug.Print
    Debug.Print Len(ss), ss
    
    i = InStr(ss, vbNullChar)
    If i Then s = Left$(ss, i -  1 )
    Debug.Print Len(s), s
End Sub
...
Рейтинг: 0 / 0
14.02.2008, 13:15
    #35132541
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
Sergey Kasatkin,
DLL, создаваемые (коробочным) VB (4-6), являются ActiveX DLL. Это значит, что в DLL не будет точки входа VBfoo, адрес которой можно получить через GetProcAddress(). Процедура VBfoo должна являться Public методом класса с соответствующим Instancing - PublicNotCreatable, MultiUse, или GlobalMultiUse. Т.е. в программе на C++ придётся создавать экземпляр COM-объекта (VB-шного класса), и обращаться к его методам. Для этого надо пропустить .DLL через OleView.exe и получить .IDL, который можно подключить к своему C++ проекту. Откомпилировав .IDL, получаем .h и .c, которые тоже используем в проекте.

void VBfoo(char* strData) можно описать на VB как Public Sub VBfoo(ByVal strData As Long), а преобразование в String выполнить примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Declare Function lstrlenA Lib "kernel32" ( _
   ByVal lpString As Long) As Long
Private Declare Function lstrcpyA Lib "kernel32" ( _
   ByVal lpString1 As String, ByVal lpString2 As Long) As Long


Public Sub VBfoo(ByVal strData As Long)
 Dim sBuf As String
 sBuf = String$(lstrlenA(strData),  0 ) 'резервирование места
 lstrcpyA sBuf, strData 'копирование и скрытое преобразование в Unicode
 'Далее используем sBuf
 Debug.Print sBuf
 '...
End Sub
В этом варианте преобразование выполняется на стороне VB. Если же параметр описать ByVal strData As String, то в C++ он будет выглядеть как BSTR. Сами смотрите, как лучше, или как привычнее.
...
Рейтинг: 0 / 0
14.02.2008, 14:27
    #35132865
Sergey Kasatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
БенедиктSergey Kasatkin,
DLL, создаваемые (коробочным) VB (4-6), являются ActiveX DLL.
Спасибо за это уточнение, но то, что я написал вначале - не совсем соответствует действительности в смысле построения приложения, уж звиняйте.
Просто так объяснить было проще :)
...
Рейтинг: 0 / 0
14.02.2008, 17:28
    #35133695
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
Бенедикта преобразование в String выполнить примерно так

А нафига преобразовывать, когда

ByRef s as String - объявляет параметр как указатель на строку...
...
Рейтинг: 0 / 0
14.02.2008, 17:41
    #35133742
Sergey Kasatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить внутри VB функции строку из null-terminated строки
AndrFА нафига преобразовывать, когда
ByRef s as String - объявляет параметр как указатель на строку...
На какую строку, осмелюсь спросить? На BSRT, верно? А передается-то что? Ферштейн?
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Получить внутри VB функции строку из null-terminated строки / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]