gpt4 book ai didi

delphi - "Incompatible types: method pointer and regular procedure"

转载 作者:行者123 更新时间:2023-12-03 15:48:36 26 4
gpt4 key购买 nike

我有一个大问题,因为我不明白指针在delphi中是如何工作的

首先,我从 dll 中获取函数声明。

功能:

type
TMICRCallback = function: Integer; stdcall;

然后我在代码中声明一个函数。

function CBMICRRead : Integer;stdcall;

功能非常简单(这是一个例子)

function TCustomizedTenderPlugin.CBMICRRead : Integer; stdcall;
var
SUCCESS:integer;
begin
SUCCESS:=1;
Result:= SUCCESS;
end;

我声明一个这样的变量

Respuesta : TMICRCallback;

当我尝试将此变量分配给我的函数时,问题发生了:(

Respuesta      := CBMICRRead;

这是我第一次在delphi中使用指针,所以也许这是一个愚蠢的问题,但请帮助我

最佳答案

TCustomizedTenderPlugin.CBMICRRead 是一个实例方法。这意味着为了调用它,您必须有一个可以调用它的实例。

另一方面,TMICRCallback 是一个函数指针。它与普通函数而不是实例方法兼容。

它们根本不兼容。为了使 TCustomizedTenderPlugin.CBMICRReadTMICCRallback 兼容,您需要将其定义为:

TMICRCallback = function: Integer of object; stdcall;

object的表示该类型与实例方法兼容。 TMICCRallback 类型的变量(如本答案中所定义)同时保存函数指针和实例指针。它有时被称为二指针函数类型。

在继续之前,我建议您仔细阅读 documentation .

<小时/>

我注意到您正在对这些函数指针使用 stdcall 调用约定。这通常表明您正在尝试与外部模块进行互操作。这对于实例方法来说并不可靠。我的意思是,您不能用 Delphi 以外的语言实现 of object 实例方法。如果此代码注定要在互操作设置中使用,那么您应该避免使用 of object

对于互操作设置,您通常会将实例指针作为单独的参数包含在内。在这种情况下,Delphi 声明将如下所示:

type
TMICRCallback = function(Data: Pointer): Integer; stdcall;

然后您将实现这样的函数

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;

最后,外部模块中传递回调的函数需要同时传递 PluginCBMICRReadCallbackTPlugin 实例的实例指针。也许有点像这样:

procedure RegisterCallback(Callback: TMICRCallback; Data: Pointer); stdcall;

你可以这样称呼:

var
Plugin: TPlugin;
....
Plugin := ...;//get this instance from somewhere
RegisterCallback(PluginCBMICRReadCallback, Plugin);
<小时/>

查看了 related question 处的 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, ....);

关于delphi - "Incompatible types: method pointer and regular procedure",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com