Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как вызвать функции Си DLL из Delphi
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
AndV
Здравствуйте!
Есть библиотека, написанная на Си (протокол 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
Возьмите исходный код и переработайте для своей задачи. В какой-то версии исходников была ошибка с расчётом CRC . Я писал автору, он ответил что в новой версии поправил. Надо проверять. Протоколом пользовался, работает прилично для моей задачи.
Delphi не знаю и помочь в коде не смогу. При использовании готовой DLL, проверьте корректность кода библиотеки.
SysRq
Попробуйте вместо array of byte использовать указатель на byte. Массив не передается, передается лишь указатель на его начало..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.