AndV 0 24 октября, 2008 Опубликовано 24 октября, 2008 · Жалоба Здравствуйте! Есть библиотека, написанная на Си (протокол Wake). Как вызывать функции из этой DLL и передавать в нее массивы? Заголовок DLL такой: ... extern "C" { WSP32_API bool WINAPI AccessCOM(char *P); WSP32_API bool WINAPI OpenCOM(char *P, DWORD baud); WSP32_API bool WINAPI CloseCOM(void); WSP32_API bool WINAPI SetModLns(DWORD F); WSP32_API bool WINAPI GetModLns(LPDWORD lpD); WSP32_API bool WINAPI PurgeCOM(void); WSP32_API bool WINAPI FlushCOM(void); WSP32_API bool WINAPI GetMaskCOM(LPDWORD lpEvtMask); WSP32_API bool WINAPI SetMaskCOM(DWORD EvtMask); WSP32_API bool WINAPI WaitEventCOM(LPDWORD lpEvtMask); WSP32_API bool WINAPI RxFrame(DWORD To, unsigned char &ADD, unsigned char &CMD, unsigned char &N, unsigned char *Data); WSP32_API bool WINAPI TxFrame(unsigned char ADDR, unsigned char CMD, unsigned char N, unsigned char *Data); } В Delphi написал так: interface ... function AccessCOM(p:string):boolean; stdcall; function OpenCOM(p:string;baud:DWORD):boolean; stdcall; function CloseCOM():boolean; stdcall; function SetModLns(f:DWORD):boolean; stdcall; function GetModLns(lpD:LPDWORD ):boolean; stdcall; function PurgeCOM():boolean; stdcall; function FlushCOM():boolean; stdcall; function GetMaskCOM(lpEvtMask:LPDWORD):boolean; stdcall; function SetMaskCOM(EvtMask:DWORD):boolean; stdcall; function WaitEventCOM(lpEvtMask:LPDWORD):boolean; stdcall; function RxFrame(Too:DWORD;var ADD:byte;var CMD:byte;var N:byte;var Data:array of byte):boolean;stdcall; function TxFrame(ADDR:byte; CMD:byte; N:byte; Data:array of byte):boolean; stdcall; ... implementation function AccessCOM; external 'wsp32.dll'; function OpenCOM; external 'wsp32.dll'; function CloseCOM; external 'wsp32.dll'; function SetModLns; external 'wsp32.dll'; function GetModLns; external 'wsp32.dll'; function PurgeCOM; external 'wsp32.dll'; function FlushCOM; external 'wsp32.dll'; function GetMaskCOM; external 'wsp32.dll'; function SetMaskCOM; external 'wsp32.dll'; function WaitEventCOM; external 'wsp32.dll'; function RxFrame; external 'wsp32.dll'; function TxFrame; external 'wsp32.dll'; Вроде работает, но не уверен, правильно ли это. Основная проблема с функцией RxFrame. Не знаю, как правильно передать в нее массив. Пробовал и статический массив и динамический, постоянно то Privileged Instructions, то Access Violation. Подскажите, как правильно описать функцию RxFrame и как правильно описать и передать в нее массив Data. Желательно пример кода. Спасибо! PS. Если имеет значение - Delphi TurboExplorer 2006 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 24 октября, 2008 Опубликовано 24 октября, 2008 · Жалоба Возьмите исходный код и переработайте для своей задачи. В какой-то версии исходников была ошибка с расчётом CRC . Я писал автору, он ответил что в новой версии поправил. Надо проверять. Протоколом пользовался, работает прилично для моей задачи. Delphi не знаю и помочь в коде не смогу. При использовании готовой DLL, проверьте корректность кода библиотеки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 28 октября, 2008 Опубликовано 28 октября, 2008 · Жалоба Попробуйте вместо array of byte использовать указатель на byte. Массив не передается, передается лишь указатель на его начало.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться