Delphi – 使用转发导出创建DLL
在C/C++中,可以创建一个DLL,其中一些导出函数被转发到其他DLL(不使用存根加载器):
#pragma comment(linker,"/export:TestFunc=Real_Lib.dll.TestFunc") 或者 – 使用.def文件: EXPORTS TestFunc=c:/Real_Lib.dll.TestFunc (注意缺少参数或返回类型). 例如 – 在DependencyWalker for kernel32.dll中 – 您可以看到: 问题: – 你能在Delphi中实现类似的DLL结果吗? (必须使用CLI编译器才行..) 基本上,想法是生成仅包含某些函数的DLL包装器,并转发其余的函数 – 无需为所有导出的函数创建存根加载器(使用参数,返回类型等). 注意: 样本(TestProgram – > Forwarder – > Real_DLL): 真正的DLL文件 – 只是你的常规DLL: library Real_Lib; function TestFunc(a,b: Integer): Integer; stdcall; begin Result := a+b; end; exports TestFunc; begin end. 转发器DLL – “转发”导出的函数到静态导入: library Forwarder; function TestFunc: Integer; stdcall; external 'Real_Lib.dll'; exports TestFunc; begin end. =注意参数可以被省略. 测试程序 – 使用转发器DLL: program TestProgram; {$APPTYPE CONSOLE} function TestFunc(a,b: Integer): Integer; stdcall; external 'Forwarder.dll'; begin Writeln('Result: ',TestFunc(2,7)); Readln; end. =这个编译和工作:结果:9. 并生成这些操作码: 00403E82 . E8 7DFFFFFF CALL <JMP.&Forwarder.TestFunc> 00403E04 $- FF25 20614000 JMP DWORD PTR DS:[<&Forwarder.TestFunc>] ; Forwarde.TestFunc 00383810 F>- FF25 08613800 JMP DWORD PTR DS:[<&Real_Lib.TestFunc>] ; Real_Lib.TestFunc 那么 – 在Delphi中转发一些只有C/C++编译魔术还是可能的呢? 解决方法
Delphi无法创建此类可执行文件.如果要从Delphi创建这样的DLL,则需要执行一些后处理.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |