如何在Delphi中结合重载和stdcall?
我有一个导出此函数的SOAP数据模块如何在Delphi中结合重载和stdcall?,delphi,delphi-7,Delphi,Delphi 7,我有一个导出此函数的SOAP数据模块 function MyFunction(MyParam1, MyParam2): boolean; stdcall; 我可以从另一个exe中使用此函数。一切正常 现在我想在同一个项目中使用相同的函数。我将它的单位添加到uses子句中,但它没有识别它(我得到了未声明的标识符)。然后我加了一个超负荷,但我不能让它工作 function MyFunction(MyParam1, MyParam2): boolean; stdcall; overload; fun
function MyFunction(MyParam1, MyParam2): boolean; stdcall;
我可以从另一个exe中使用此函数。一切正常
现在我想在同一个项目中使用相同的函数。我将它的单位添加到uses子句中,但它没有识别它(我得到了未声明的标识符)。然后我加了一个超负荷,但我不能让它工作
function MyFunction(MyParam1, MyParam2): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2): boolean; overload;
我得到“字段定义不允许…”
我希望能够使用stdcall从外部访问函数,但也可以像公共库函数调用一样从内部访问函数。有人知道我如何做到这一点吗?您的问题与通话约定无关 需要注意的几件事: 一只愚蠢的虫子 首先,
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
在界面
部分声明。界面就是其他单位看到的
呼叫约定
您可以在自己的项目中使用stdcall
。这根本不是问题。您可能甚至不会注意到该函数有一个“不寻常”的调用约定
重载函数
一对重载函数(过程)是一对同名但参数列表不同的函数(过程),如中所示
function Add(A, B: integer): integer; overload;
function Add(A, B: real): real; overload;
两个函数不能具有相同的名称和参数列表,即使它们重载。事实上,如果这是允许的,那么编译器怎么知道你要调用什么函数呢 由于未指定参数类型,因此呈现的代码无法编译。如果这样做,那么只要参数列表不同,它就可以正常工作 例如,这可以很好地编译:
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
版本。不可能,重载
在参数列表上有所不同(顺便说一句,这里有语法错误),但在返回类型或调用约定上不一样。您不能在项目内部使用stdcall
版本吗,StDead和性能的注释:C++中的登记约定有名称y*FASTLCAL,它不仅仅是一个随机名称,STDCLAK更慢。@用户MS FASTLASK!Borland fastcall,又名register。