Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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
На этот код

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()) )) )


Ругается, что 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 (так будет корректнее), но, ИМХО, тут жжот твоя библа.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам