Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.96.159] |
|
Сообщ.
#1
,
|
|
|
Помогите, я окончательно запутался. Опыт работы в Delphi небольшой...
Использую DLL от китайского оборудования, необходимо подписаться на события, которые он генерирует. В .H файле функция описана так typedef void (* DECODE_NOTIFY_CALLBACK)(void *buf, DWORD DataLen); FSC_API int __stdcall EnableDecodeNotify(HCONNECT hConnect, HANDLE hWnd, DWORD Option, void *Buffer, DWORD BufferSize, DECODE_NOTIFY_CALLBACK callback); Пишу на Delphi, даже не компилируется type TDecodeNotify = procedure(Buffer:PChar;Size:integer); stdcall; ...... TMyClass = class(TV8UserObject) private procedure DecodeNotify(Buffer: PChar; Size:integer); stdcall; ...... // Реализация события procedure TMyClass.DecodeNotify(Buffer: PChar; Size:integer); var Module, Event, Data: PWideChar; ResStr: ansistring; begin Module := PWideChar('Hardware'); Event := PWideChar('Scan'); if Size>0 then SetString(ResStr, Buffer, Size) else ResStr := ''; Data := PWideChar(ResStr); V8.ExternalEvent(Module, Event, Data); end; ...... // Нерабочая попытка подписаться на события function TMyClass.SearchCOMA(RetValue: PV8Variant; Params: PV8ParamArray; const ParamCount: integer; var v8:TV8AddInDefBase): boolean; var ScanerID: integer; FunctionDLL:TSearchCOMW; FunctionDLL2:TEnableDecodeNotify; begin ........ ScanerID:= FunctionDLL(ComPort); { используем ф-ию } if ScanerID <> -1 then begin @FunctionDLL2 := GetProcAddress(HandleDLL, '_EnableDecodeNotify@24'); Assert(@FunctionDLL2 <> nil); FunctionDLL2(ScanerID,0,0,Addr(Buffer),SizeOf(Buffer),DecodeNotify); // <= Тут ошибка // [dcc32 Error] cino1.pas(159): E2009 Incompatible types: 'regular procedure and method pointer' end; end; Что я делаю не так ??? Как правильно подписаться на событие DLL ? |
Сообщ.
#2
,
|
|
|
Цитата tiger1c @ Что я делаю не так ??? В сообщении об ошибке все сказано: несмотря на видимое одинаковое объявление параметров обычная процедура и метод класса являются несовместимыми процедурными типами (т.к. на самом деле любой метод класса имеет дополнительный скрытый параметр - указатель Self). Соотв-но эти типы и объявляются по разному: type TDecodeNotifyProc = procedure(Buffer:PChar;Size:integer); stdcall; //обычная процедура TDecodeNotifyMethod = procedure(Buffer:PChar;Size:integer) of object; stdcall; //метод класса Цитата tiger1c @ Как правильно подписаться на событие DLL ? Объявить DecodeNotify как обычную процедуру, а не метод класса. |
Сообщ.
#3
,
|
|
|
В сообщении же написано - коллбэк процедура должна быть простой процедурой, а не методом объекта.
procedure DecodeNotify(Buffer: PChar; Size: DWord); stdcall; var ... Кроме того, манипуляции внутри процедуры с кастингом ansistring к PWideChar могут быть сомнительными |