Dll中的函数重载处理

ymxxm 2000-07-17 12:36:00
请高手指点:如何在Dll中重载函数(需要导出同名函数)
...全文
287 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JGTM2000 2000-07-17
  • 打赏
  • 举报
回复
导出同名函数是不可能的。否则就不会有mangled name了(见过C++输出的函数名吧?)。

Michaelyfj提到的overload是可以对名称相同但参数表不同的函数进行重载,但是在输出的时候,虽然有相同的名称编译器并不会报错,但是在实际引入时无法确定调用的到底是哪一个,因此显然将导致无法预测的堆栈错误。

怎么办?在exports时候为函数的不同版本明确指定不同名称即可。如下:

library BeepLib;

uses
Windows, SysUtils;

procedure Beep(seed: PWideChar); overload; stdcall;
begin
Windows.Beep(StrToIntDef(seed),0),1000);
end;

procedure Beep(seed: PChar); overload; stdcall;
begin
Windows.Beep(StrToIntDef(seed,0),1000);
end;

exports
Beep(seed: PWideChar) name 'BeepW',
Beep(seed: PChar) name 'BeepA';

end.

在调用时引入的时候同样附上name属性即可:
project TestOverload;

procedure Beep(freq: PWideChar); stdcall;
external 'BeepLib.dll' name 'BeepW'; overload;
procedure Beep(freq: PChar); stdcall;
external 'BeepLib.dll' name 'BeepA'; overload;

begin
Beep(StrToOleStr('10000'));
Beep(PChar('5000'));
end.

相信有更好的办法解决你的实际需求。
gsoft 2000-07-17
  • 打赏
  • 举报
回复
关注
Michaelyfj 2000-07-17
  • 打赏
  • 举报
回复
用保留字overload可实现dll重载,要具体例子请与我联系
e-mail:yfj321@163.net

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧