У меня есть dll и файл библиотеки для использования Dll. В файлеИспользовать функцию из dll
TOnPortStatusChanged = procedure (cardNo:integer; portNo:integer; newPortStatus:byte); stdcall;
TOnPortDataReady = procedure (cardNo:integer; portNo:integer; dataBuff:PByteArray; buffLen:integer); stdcall;
T_API_INIT_PARAMS = record
OnPortStatusChanged :TOnPortStatusChanged;
OnPortDataReady :TOnPortDataReady ;
end;
P_API_INIT_PARAMS = ^T_API_INIT_PARAMS ;
//....
//...
var
PR_Init: function (initParams: P_API_INIT_PARAMS):integer; stdcall;
, когда я хочу, чтобы использовать эту функцию в моей программе, мой код:
procedure PortStatusChanged(cardNo: integer; portNo: integer; newPortStatus: byte); stdcall;
begin
//...
end;
procedure TMainThread.CheckDevices;
var
vCount: integer;
initParams: T_API_INIT_PARAMS;
begin
initParams.OnPortStatusChanged := PortStatusChanged;
initParams.OnPortDataReady := nil;
vCount := PR_Init(@initParams);
Это прекрасно работает. Но я хочу использовать процедуру PortStatusChanged в классе TMainThread. Поэтому я пишу процедуру в классе TMainThread и изменить тип TOnPortStatusChanged подобное:
TOnPortStatusChanged = procedure (cardNo:integer; portNo:integer; newPortStatus:byte) of object; stdcall;
Когда я запускаю свою программу таким образом; PortStatusChanged работает правильно в первый раз, а во втором - ошибка нарушения доступа.
Где я принимаю ошибку?
Но я думаю, что DLL автоматически вызывает мою функцию. Итак, как я могу проверить указатель fucntion? – SimaWB