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

Sam*_*Sam 2 delphi delphi-7

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

function MyFunction(MyParam1, MyParam2): boolean; stdcall;
Run Code Online (Sandbox Code Playgroud)

我可以从另一个exe使用此函数.一切正常.

现在我想在它所在的同一个项目中使用相同的函数.我将它的单位添加到uses子句但它没有识别它(我得到了Undeclared Identifier).然后我添加了一个重载,但我无法让它工作.

function MyFunction(MyParam1, MyParam2): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2): boolean; overload;
Run Code Online (Sandbox Code Playgroud)

我得到"不允许字段定义......"

我希望能够使用stdcall从外部访问该函数,但也可以在内部使用常见的库函数调用.有谁知道我怎么能做到这一点?

And*_*and 8

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

有几点需要注意:

一个愚蠢的小虫

第一,

function MyFunction(MyParam1, MyParam2): boolean; stdcall;
Run Code Online (Sandbox Code Playgroud)

是语法错误.你忘了指定类型的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.
Run Code Online (Sandbox Code Playgroud)

只有Func1将其他单位可见,因为只有Func1宣布interface部分.接口就是其他单位看到的.

召集会议

您可以stdcall在自己的项目中使用.这根本不是问题.您甚至可能不会注意到该函数具有"不寻常"的调用约定.

重载功能

一对重载函数(过程)是一对具有相同名称但具有不同参数列表的函数(过程),如

function Add(A, B: integer): integer; overload;
function Add(A, B: real): real; overload;
Run Code Online (Sandbox Code Playgroud)

两个函数不能具有相同的名称和参数列表,即使它们被重载也是如此.实际上,如果允许这样,那么编译器知道你想要调用什么函数的世界怎么样?!


Dav*_*nan 5

您提供的代码无法编译,因为您没有指定参数类型.如果这样做,那么只要参数列表不同,它就可以正常工作.

例如,这编译好:

function MyFunction(MyParam1, MyParam2: Integer): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2: Double): boolean; overload;
Run Code Online (Sandbox Code Playgroud)

但这不是:

function MyFunction(MyParam1, MyParam2: Integer): boolean; stdcall; overload;
function MyFunction(MyParam1, MyParam2: Integer): boolean; overload;
Run Code Online (Sandbox Code Playgroud)

重载是指具有相同名称但具有不同参数列表的多个方法的位置.无论何时调用重载方法,编译器都会选择其参数列表与传递的参数匹配的方法.


我怀疑你试图使用相同的参数列表重载该方法两个版本的方法,但不同的调用约定.这不行.无法基于调用约定(或函数返回值类型)执行重载方法解析.只需在stdcall内部和外部使用该版本.