Перейти к содержанию
    

Как вызвать функции Си DLL из Delphi

Здравствуйте!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возьмите исходный код и переработайте для своей задачи. В какой-то версии исходников была ошибка с расчётом CRC . Я писал автору, он ответил что в новой версии поправил. Надо проверять. Протоколом пользовался, работает прилично для моей задачи.

Delphi не знаю и помочь в коде не смогу. При использовании готовой DLL, проверьте корректность кода библиотеки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте вместо array of byte использовать указатель на byte. Массив не передается, передается лишь указатель на его начало..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...