Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.08.2017, 06:25
tiger1c tiger1c вне форума
Прохожий
 
Регистрация: 20.08.2017
Сообщения: 3
Версия Delphi: Delphi XE3
Репутация: 10
По умолчанию Помогите подписаться на события DLL...

Помогите, я окончательно запутался. Опыт работы в 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  
Старый 20.08.2017, 07:18
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Не все типы объявлены даже. И нет импорта функции.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 20.08.2017, 12:32
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Нельзя метод класса передать в качестве callback.
Код:
...
// [dcc32 Error] cino1.pas(159): E2009 Incompatible types: 'regular procedure and method pointer'
...
Цитата:
callback функция - это "обычная" процедура, ее невозможно представить как метод класса. Нужно писать по крайней мере переходник, который уже будет вызывать нужный метод.
Цитата:
A method pointer is really a pair of pointers; the first stores the address of a method, and the second stores a reference to the object the method belongs to.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter