我有一个导出此功能的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从外部访问该函数,但也可以在内部使用常见的库函数调用.有谁知道我怎么能做到这一点?
您的问题与调用约定无关.
有几点需要注意:
第一,
function MyFunction(MyParam1, MyParam2): boolean; stdcall;
Run Code Online (Sandbox Code Playgroud)
是语法错误.你忘了指定类型的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.
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)
两个函数不能具有相同的名称和参数列表,即使它们被重载也是如此.实际上,如果允许这样,那么编译器知道你想要调用什么函数的世界怎么样?!
您提供的代码无法编译,因为您没有指定参数类型.如果这样做,那么只要参数列表不同,它就可以正常工作.
例如,这编译好:
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
内部和外部使用该版本.
归档时间: |
|
查看次数: |
1123 次 |
最近记录: |