Есть библиотека, написанная на Си (протокол 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);
}
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';
...
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