2013-02-13 25 views
0

我得到了下面的问题:声明使用不同的参数,从C-DLL函数帕斯卡

我加载一个C-DLL中的函数在我Lazarus计划像

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

这个功能得到了不同在C-DLL中有不同变量的实现,所以我必须在Lazarus项目中多次声明它。我想它想:

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声明允许” “错误:程序指令‘过载’不允许procvar宣言”

我在做什么错? = /如果我删除它编译的“var”,但我认为我需要“var”还是我错了?

+1

覆盖用于方法。你是否可以通过在帕斯卡尔一侧不使用相同的名字来回避这个问题? – 2013-02-13 16:49:11

+4

你正在导入的函数不会*具有不同参数的不同实现。 DLL不支持重载。每个导出的名称都只引用DLL中的一个函数。如果DLL导出多个函数,那么它们都使用不同的名称,并且没有理由不应该在Delphi代码中使用这些不同的名称。 – 2013-02-13 17:09:32

回答

4

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

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

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

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

我必须承认,我很惊讶你为这些变量选择了相同的名字。它们在C代码中必须有不同的名称,并且它们必须以不同名称从DLL中导出。我希望你不想用不同的参数列表调用相同的函数。那肯定不行。

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