怎么实现用一个函数别名去替换dll文件中的实际函数名?(200分)

  • 主题发起人 主题发起人 guilinlzy
  • 开始时间 开始时间
G

guilinlzy

Unregistered / Unconfirmed
GUEST, unregistred user!
想这么做的目的是出于为了更好的封装好业务接口文件以及其他的一些原因,但要实现的目标就是如标题所示“用一个函数别名去替换dll文件中的实际函数名”。
可能有人提出不理解我为什么要这样做?我也明白函数名在编译时就已经确定,而不是运行时,但还是想实现上面这样的功能。
请问各位朋友,是否有什么方法能够实现以上这样的功能或其他能解决这样问题的建议,万分感谢!
 
请有经验或有思路的朋友给个建议
 
用函数指针或者生成一个中间DLL文件, 由中间DLL来实际调用你的DLL
 
to tseug:
谢谢了,但能更具体点吗?有实例更好。因为我对delphi掌握的不是很好,而且有将近两年的时间没有用delphi进行开发了,最近也是因为项目开发的原因和项目管理的需要,我希望像上面这么做
 
用动态调用的方法
代码如下:
type
Fmryt=function(app:Tapplication;ico:Ticon;ct:string;inf:string):string;stdcall;

procedure Tax_form_main.FormShow(Sender: TObject);
var
myyhdl:Fyhdl;
dllhandle:Thandle;
user:string;
begin
user:='';
dllhandle:=loadlibrary('dljm.dll');
if dllhandle<>0 then
begin
///////////////////////////////////
//这里是你要的部分
//////////////////////////////////
@myyhdl := GetProcAddress(DLLHandle, 'yhdl');
///////////////////////////////////
///////////////////////////////////
if Assigned(myyhdl) then
begin
try
if soap1.Checked then
user:=myyhdl(application,SoapConnection1,nil,'');
if ado1.Checked then
user:=myyhdl(application,nil,adoconnection1,'');
except
messagebox(application.Handle,'无法调用程序运行所需的函数!','运行错误',mb_ok+mb_iconerror);
freelibrary(dllhandle);
application.Terminate
end;
end
else
begin
messagebox(application.Handle,'无法加载程序运行所需的函数!','运行错误',mb_ok+mb_iconerror);
freelibrary(dllhandle);
application.Terminate;
end;
end
else
begin
messagebox(application.Handle,'无法加载程序运行所需的文件!','运行错误',mb_ok+mb_iconerror);
freelibrary(dllhandle);
application.Terminate;
end;

if user='' then
begin
//messagebox(application.Handle,'用户登陆失败!请确认您的用户名和密码。','登录失败',mb_ok+mb_iconerror);
application.Terminate;
end
else
begin
//这里需要加入权限判断的代码
end;


hold:=true;
panel1.Visible :=true;
tim_hide.Enabled :=false;
sbt_hide.Enabled :=false;
sbt_hold.Glyph:= img_hold.Picture.Bitmap ;
pl_sp.Visible :=false;
if strtobool(mryt_inf.Strings[1]) then
n5.Click;
end;
 
或者你可以隐式调用DLL函数的。
例如:
TRasHangUp = function(
RASConn: hrasConn // Handle to the Remote Access Connection to hang up }
): Longint;
stdcall;
//定义这个函数的结构。
var
FRasHangUp: TRasHangUp;
FDll: THandle;
begin
...
FDll := LoadLibrary(PChar(RsRasDllName));// RsRasDllName - DLL名称
if FDll <> 0 then
begin
FRasHangUp := GetProcAddress(FDll, 'RasHangUpA');//取得函数地址
end
else
raise;
end;

调用:
...
if Assigned(FRasHangUp) then
FRasHangUp(..);
 
不知道楼主要的是不是楼上所说的效果。。。??
vf就很简单,直接给在声明函数的后面就行了。
 
不知道是我的叙述不明确还是怎么着?大家提到的都是怎么动态调用dll的问题,这似乎并不是本贴的主要目的,我想我的意思是这样的:
1.这是dll文件中封装的一个编码的函数声明:
function A1001(const strFormat: WideString): WideString;
stdcall;
2.为了便于其他开发人员可以从语义上更好更直观的了解封装的dll函数功能和其他的考虑,希望通过建立一个类似接口代码对照表:
key value
A1001 AddUser
...
来进行转换
3.希望客户端开发人员可以通过调用AddUser来代替调用真实的函数A1001,而不是调用 A1001函数。
综上,期望能公布一组语义明确的函数通过转换来调用dll中封装的实际函数。
示例:
客户端使用时用AddUser(UserCode:string,UserName:string)来替代A1001(UserCode:string,UserName:string)
问题是:对照表是很简单可以建立的,但是如何实现函数名称的变换呢???
 
function A1001(const strFormat: WideString): WideString;
stdcall;
调用
function AddUser(const strFormat: WideString) :WideStrig //定义新函数
begin
result:=A1001(strFormat);
end;

 
后退
顶部