28.03.2006, 17:44 | #1 |
Участник
|
Не могу понять почему
Добрый день! вопрос такой.
есть некая dll-ка которую static void Job1(Args _args) { boolean ret ; DLL MyDll = new DLL('XXX.DLL'); DLLFunction fOpenComm = new DLLFunction(InetDll, 'OpenComm'); ; fOpenComm.returns(ExtTypes::Byte); fOpenComm.arg(ExtTypes::dWord, ExtTypes::dWord, ExtTypes::Byte); ret = fOpenComm.call(3,1,0); } .....................описание функции DLL.....+++................... // Функция:Открыть СОМ порт // Параметры: // int nCommPort - целое, номер СОМ-порта, 1..16 // int nCommSpeed - целое, скорость СОМ - порта, 1..5 (1 - 115200, 2 - 57600, 3 - 38400, 4 - 19200, 5 - 9600) // BOOL bIsIrDA // Возвращаемое значание: // TRUE - если СОМ порт успешно открыт // FALSE - иначе. __declspec(dllimport) BOOL __cdecl OpenComm(int nCommPort, int nCommSpeed, BOOL bIsIrDA); .....................описание функции DLL...---..................... при выполнении выкидывает ошибку Значение регистра ESP не было сохранено при вызове функции "OpenComm" в библиотеке DLL "d:\winnt\system32\XXX.dll". Причиной может являться вызов функции DLL, которая объявлена с неверным числом аргументов. есть пример на дельфях --- всё работает! function TCipherIO.OpenComm(CommPort: Integer; IsCradle: Boolean) : Boolean; begin FCommPort := CommPort; FIsCradle := IsCradle; boolean FCommSpeed := CommSpeed; Result := _OpenComm(FCommPort, FCommSpeed, FIsCradle); {$IFNDEF USECHECK} FActive := Result; {$ENDIF USECHECK} end; Почему ? Заранее благодарен |
|
28.03.2006, 18:00 | #2 |
Гость
|
Размещение параметров в стеке не верно посмотри WinAPI, stdcall и т.п.
|
|
28.03.2006, 18:02 | #3 |
Участник
|
Кроме того, BOOL определяется как typedef int BOOL, т.е. надо использовать ExtTypes::dWord
__________________
Axapta v.3.0 sp5 kr2 |
|
28.03.2006, 18:08 | #4 |
Участник
|
Большое спасибо AndyВ прокатило...
|
|
28.03.2006, 18:08 | #5 |
Участник
|
Точнее AndyD
|
|
|
|