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

时间:2011-06-06 19:31:30

标签: delphi delphi-7

我有一个导出此功能的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从外部访问该函数,但也可以在内部使用常见的库函数调用。有谁知道我怎么能做到这一点?

2 个答案:

答案 0 :(得分:8)

您的问题与调用约定无关。

需要注意的一些事项:

一个愚蠢的小虫

首先,

function MyFunction(MyParam1, MyParam2): boolean; stdcall;

是语法错误。您忘记指定MyParam1MyParam2的类型。

可见性

考虑单位

  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版本。