Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Delphi中结合重载和stdcall?_Delphi_Delphi 7 - Fatal编程技术网

如何在Delphi中结合重载和stdcall?

如何在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

我有一个导出此函数的SOAP数据模块

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。