TCustomizedTenderPlugin.CBMICRRead
是一个实例方法。这意味着在调用它之前必须有一个实例。
另一方面,TMICRCallback
是一个函数指针。它与普通函数兼容,而不是实例方法。
它们根本不兼容。为了使TCustomizedTenderPlugin.CBMICRRead
与TMICRCallback
兼容,您需要将其定义为:
TMICRCallback = function: Integer of object
of object
表示此类型与实例方法兼容。 类型为
TMICRCallback
(在本答案中定义)的变量包含函数指针和实例指针。有时也称为双指针函数类型。
在继续之前,建议您仔细阅读
文档。
我注意到您正在为这些函数指针使用
stdcall
调用约定。这通常表示您正在尝试与外部模块进行互操作。但是对于实例方法,这并不可靠。我的意思是,除 Delphi 语言外,您无法实现
of object
实例方法。如果此代码将用于互操作设置,则应避免使用
of object
。
对于互操作设置,通常会将实例指针作为单独的参数包括在内。在这种情况下,Delphi 声明如下:
type
TMICRCallback = function(Data: Pointer): Integer
您可以像这样实现此类函数:
type
TPlugin = class
function CBMICRRead: Integer;
end;
.....
function PluginCBMICRReadCallback(Data: Instance): Integer; stdcall;
begin
Result := TPlugin(Data).CBMICRRead;
end;
function TPlugin.CBMICRRead: Integer;
begin
Result := ....
end;
最后,传递回调函数的外部模块中的函数需要同时传递PluginCBMICRReadCallback
和TPlugin
实例的指针。可能会像这样:
procedure RegisterCallback(Callback: TMICRCallback; Data: Pointer); stdcall;
你会这样调用它:
var
Plugin: TPlugin
....
Plugin := ...
RegisterCallback(PluginCBMICRReadCallback, Plugin)
经过查看相关问题中的C++代码,界面的C++部分如下:
int WINAPI BiMICRSetReadBackFunction(int nHandle,
int (CALLBACK *pMicrCB)(void),
LPBYTE pReadBuffSize,
LPBYTE readCharBuff,
LPBYTE pStatus,
LPBYTE pDetail);
这个回调函数甚至不允许使用数据指针,因此您根本无法使用实例方法。如何为多个实例实现回调,对我来说还是个谜!无论如何,您可以在Delphi中像这样声明此函数:
type
TMICRCallback = function: Integer; stdcall;
function BiMICRSetReadBackFunction(
nHandle: Integer;
MicrCB: TMICRCallback;
pReadBuffSize: PByte;
readCharBuff: PByte;
pStatus: PByte;
pDetail: PByte
): Integer; stdcall; external dllname;
要调用它,您需要这个:
function MICRCallback: Integer; stdcall;//not the method of a class
begin
Result := ....
end;
.....
retval := BiMICRSetReadBackFunction(..., MICRCallback, ....);