使用Pascal中的不同参数从C-DLL声明函数

时间:2013-02-13 16:40:50

标签: delphi dll pascal

我遇到了以下问题:

我正在我的Lazarus项目中加载一个C-DLL的函数,如

@dpstate_callCustomfunction:= GetProcAddress(mConnectorLibrary, 'dpstate_callCustomfunction');  

这个函数在C-DLL中使用不同的变量得到了不同的实现,所以我必须在Lazarus项目中声明它超过1次。我尝试过这样:

 var dpstate_callCustomfunction: function(plugin, method, paramName: string; customfunctionCallbackFunction: string; id: PChar): integer; stdcall; overload; override;
 var dpstate_callCustomfunction: function(plugin, method, paramName: string; resultParam: PChar): integer; stdcall; reintroduce; overload;

但编译器告诉我以下错误: “错误:procvar声明中不允许使用过程指令”OVERRIDE“ “错误:procvar声明中不允许使用过程指令”OVERLOAD“

我做错了什么? = /如果我删除了“var”它会编译,但我认为我需要“var”或者我错了吗?

1 个答案:

答案 0 :(得分:4)

由于您要声明变量,因此它们必须具有不同的名称。与可以重载相同名称的函数,过程和方法不同。

因此,通过为两个变​​量选择不同的名称来解决您的问题。

并删除两个变量声明中stdcall之后的所有内容。这些关键字仅适用于程序和方法,而不适用于程序变量。

如果要使用GetProcAddress明确链接,则必须使用变量。您需要一个变量来保存GetProcAddress返回的函数指针。如果您使用external关键字隐式链接,那么您将没有变量。然后你可以声明用相同的名称重载的函数。

我必须承认,我为这些变量选择了相同的名称感到惊讶。它们必须在C代码中具有不同的名称,并且必须使用不同的名称从DLL导出它们。我希望你不要试图用不同的参数列表调用相同的函数。这当然行不通。

我可以看到的另一个问题是你的string参数不可能与C库中使用的参数匹配。你需要使用PChar我怀疑。但这确实是另一个问题的主题。