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

问题描述

| 我有一个导出此功能的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
,因为在
interface
节中仅声明了
Func1
。界面是其他单位看到的。 调用约定 您可以在自己的项目中使用ѭ9。那根本不是问题。您可能甚至不会注意到该函数具有\'unusual \'调用约定。 重载功能 一对重载函数(过程)是一对名称相同但参数列表不同的函数(过程),如
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; overload;
重载是您使用名称相同但参数列表不同的多个方法的地方。每当调用重载方法时,编译器都会选择其参数列表与传递的参数匹配的方法。 我怀疑您试图为两个版本的方法使用相同的参数列表来重载该方法,但使用不同的调用约定。这是行不通的。无法基于调用约定(或与此相关的函数返回值类型)执行重载的方法解析。只需在内部和外部使用
stdcall
版本即可。