Страница: 1 |
Страница: 1 |
Вопрос: Использование DLL (C++) в VB. HELP
Добавлено: 27.11.06 00:59
Автор вопроса: Sergei
Есть библиотека написанния в MS Visual C++. Мне нужно исопльзовать из нее функцию ReadParam. В руководстве по библиотеке есть такое предложение:
///
"bsa4f.dll - динамическая библиотека-расширение и поддерживает MFC интерфейс - экспортирует класс CbsaFunctions....".
Далее
"... программы имеют доступ только к функциям класса CbsaFunctions декларированных публичным способом..."
Одной из функций этого класса является функция ReadParam:
BOOL ReadPAram(DataCommPort *pDataPort, CStringArray*pStringArr);
описание типа DataCommPort
struct DataCommPort {
DWORD dwBaudRate;
BYTE nCom;
BYTE nError;
BYTE nLanguage;
};
///
Что я сделал:
Код:
Type pDataPort
dwBaudRate As Long
nCom As Byte
nError As Byte
nLanguage As Byte
End Type
Public Declare Function ReadParam2 _
Lib "bsa4f.dll" Alias "ReadParam" _
(ByVal pDataPort, ByVal pStringArr As String) As Long
dwBaudRate = 9600
nCom = 0
nError = 0
nLanguage = 3
x = ReadParam2(pDataPort, StrokA4)
При запуске получаю ощибку can't find DLL entry point .
Помогите, где я делаю ошибку?
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 27.11.06 01:59
Посмотри таблицу импорта этой DLL, это, возможно, COM DLL. А может, у нее имя функции декорировано.
Номер ответа: 2
Автор ответа:
Sergei
Вопросов: 1
Ответов: 4
Профиль | | #2
Добавлено: 27.11.06 02:07
Вот что видно через PE Explorer:
Name
?ReadParam@CBsaFunctions@@QAEHPAUDataCommPort@@PAVCStringArray@@@Z
Syntax Details
Undecorated C++ Function:
public: int __thiscall CBsaFunctions::ReadParam(struct DataCommPort *,class CStringArray *)
Я ставлю "?ReadParam@CBsaFunctions@@QAEHPAUDataCommPort@@PAVCStringArray@@@Z" в Alias, но программа сразу вываливается при запуске функции. Похоже, что я где-то напутал с объявлением/передачей переменных. Но я к сожалению не знаю в каком формате переменные я должен использовать из VB...
Номер ответа: 3
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #3
Добавлено: 27.11.06 03:43
В С++ значок * обозначает поинтер(указатель)
значит декларировать функцию надо ByRef.
или ByVal передавать поинтер на локальные переменные
плюс еще один момент -
параметр CStringArray говорит о том что это указатель на МАССИВ(array) строк.
Я бы определил ее как
Type pDataPort
dwBaudRate As Long
nCom As Byte
nError As Byte
nLanguage As Byte
End Type
Lib "bsa4f.dll" Alias "ReadParam" _
(ByVal pDataPort as POINTER, ByVal pStringArr As POINTER) As Boolean
' ... вызывать
DIM str(x) as STRING
DIM pData as pDataPort
x=ReadParam(ByVal VARPTR(pData), ByVal VARPTR(str(LBOUND(str()) )) )
Вообще для полной корректности надо знать
точно как оперделен класс CStringArray в С++
, т.е. какой это массив строк (фиксированой длины, ASCIIz[.т.е. строки заканчивающиеся нулем]...)
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 27.11.06 11:42
Объявляй функцию в DLL с использованием extern "C", тогда имена не будут декорироваться.
Номер ответа: 5
Автор ответа:
Sergei
Вопросов: 1
Ответов: 4
Профиль | | #5
Добавлено: 27.11.06 13:57
DLL писал не я, поэтому приходится работать с тем что есть...
Номер ответа: 6
Автор ответа:
Sergei
Вопросов: 1
Ответов: 4
Профиль | | #6
Добавлено: 27.11.06 14:14
На этот код
dwBaudRate As Long
nCom As Byte
nError As Byte
nLanguage As Byte
End Type
Lib "bsa4f.dll" Alias "ReadParam" _
(ByVal pDataPort as POINTER, ByVal pStringArr As POINTER) As Boolean
' ... вызывать
DIM str(x) as STRING
DIM pData as pDataPort
x=ReadParam(ByVal VARPTR(pData), ByVal VARPTR(str(LBOUND(str()) )) )
Ругается, что User-defined type not defined??
Номер ответа: 7
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #7
Добавлено: 28.11.06 10:36
Еще бы... а что за зверь такой POINTER и почемы ты вместо этого звера передаешь указатель на первый элемент строкового массива и указатеель на pDataPort?
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 28.11.06 10:52
Тут интересно - что именно эта функция возвращает. Если указатель на CStringArray - то это MFC класс, в VB с ним будут трудности.
Но в таком случае можно объявить так
Public Declare Function ReadParam2 Lib "bsa4f.dll" Alias "ReadParam" (ByRef lpDataPort as pDataPort, ByRef lpStringArr As Long) As Boolean
Тогда в lpStringArr будешь (или не будешь, это как повезет) иметь указатель на CStringArray. Что будешь с ним делать - твоя проблема.
Номер ответа: 9
Автор ответа:
Sergei
Вопросов: 1
Ответов: 4
Профиль | | #9
Добавлено: 28.11.06 20:39
При запуске получаю Visual Basic has encountered a problem and needs to close. We are sorry...
Пойду учить C#...
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 29.11.06 10:44
Ппц )
Не думал что так бывает. Можешь попробовать заменить RetVal с Boolean на Long (так будет корректнее), но, ИМХО, тут жжот твоя библа.