我有一个导出此功能的SOAP数据模块
function MyFunction(MyParam1, MyParam2): boolean; stdcall;
我可以从另一个exe使用此函数。一切正常。
现在我想在它所在的同一个项目中使用相同的函数。我将它的单位添加到uses子句但它没有识别它(我得到了Undeclared Identifier)。然后我添加了一个重载,但我无法让它工作。
function MyFunction(MyParam1, MyParam2): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2): boolean; overload;
我得到“不允许使用字段定义......”
我希望能够使用stdcall从外部访问该函数,但也可以在内部使用常见的库函数调用。有谁知道我怎么能做到这一点?
答案 0 :(得分:8)
您的问题与调用约定无关。
需要注意的一些事项:
首先,
function MyFunction(MyParam1, MyParam2): boolean; stdcall;
是语法错误。您忘记指定MyParam1
和MyParam2
的类型。
考虑单位
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
function Func1(MyParam1, MyParam2: integer): boolean;
implementation
function Func1(MyParam1, MyParam2: integer): boolean;
begin
ShowMessage('Func1');
end;
function Func2(MyParam1, MyParam2: integer): boolean;
begin
ShowMessage('Func2');
end;
end.
其他单位只能看到Func1
,因为在Func1
部分中只有interface
宣布。接口就是其他单位看到的。
您可以在自己的项目中使用stdcall
。这根本不是问题。您甚至可能不会注意到该函数具有“不寻常”的调用约定。
一对重载函数(过程)是一对具有相同名称但具有不同参数列表的函数(过程),如
function Add(A, B: integer): integer; overload;
function Add(A, B: real): real; overload;
两个函数不能具有相同的名称和参数列表,即使它们过载也是如此。实际上,如果允许这样,那么编译器知道你想要调用什么函数的世界怎么样?!
答案 1 :(得分:5)
您提供的代码无法编译,因为您尚未指定参数类型。如果这样做,那么只要参数列表不同,它就可以正常工作。
例如,编译很好:
function MyFunction(MyParam1, MyParam2: Integer): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2: Double): boolean; overload;
但这不是:
function MyFunction(MyParam1, MyParam2: Integer): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2: Integer): boolean; overload;
重载是指具有相同名称但具有不同参数列表的多个方法的位置。无论何时调用重载方法,编译器都会选择其参数列表与传递的参数匹配的方法。
我怀疑你试图使用相同的参数列表为方法的两个版本重载方法,但是使用不同的调用约定。这不行。无法基于调用约定(或函数返回值类型)执行重载方法解析。只需在内部和外部使用stdcall
版本。