Delphi-使用转发导出创建DLL
在C/C++中,可以创建一个DLL,其中一些导出函数被转发到另一个DLL(无需使用存根加载器): 或者使用.def文件:Delphi-使用转发导出创建DLL,delphi,dll,Delphi,Dll,在C/C++中,可以创建一个DLL,其中一些导出函数被转发到另一个DLL(无需使用存根加载器): 或者使用.def文件: EXPORTS TestFunc=c:/Real_Lib.dll.TestFunc (注意缺少参数或返回类型) 例如,在kernel32.dll的DependencyWalker中,您可以看到: ntdll.AddVectoredExceptionHandler“> 问题:-您能在Delphi中为DLL获得类似的结果吗?(可以使用CLI编译器) 其基本思想是生成只
EXPORTS
TestFunc=c:/Real_Lib.dll.TestFunc
(注意缺少参数或返回类型)
例如,在kernel32.dll
的DependencyWalker
中,您可以看到:
ntdll.AddVectoredExceptionHandler“>
问题:-您能在Delphi中为DLL获得类似的结果吗?(可以使用CLI编译器) 其基本思想是生成只重载某些函数的DLL包装器,并转发其余函数,而不必为所有导出函数(带有参数、返回类型等)创建存根加载器
注意: 我知道您实际上可以为引用import=大改进的导出函数ommit方法参数。
但仍然需要指定正确的方法类型(过程/函数)、返回类型(函数)和调用约定
示例(TestProgram->Forwarder->Real\u 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
虽然
DependencyWalker
将其显示为常规导出,只是调用导入函数:
并生成这些操作码:
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
00403E82.E8 7DFFFFFF调用
00403E04$-FF25 20614000 JMP DWORD PTR DS:[];Forwarde.TestFunc
00383810 F>-FF25 08613800 JMP DWORD PTR DS:[];Real_Lib.TestFunc
那么,在Delphi中,是否真的转发一些C/C++编译器的魔法或是可能的? < P> delphi不能创建这样的可执行文件。如果你想用Delphi创建这样的DLL,你需要执行一些后处理。< /P>这不是C或C++的一个特性,但它可能是微软编译器的一个特点。我怀疑Delphi能做S。我最终把它分成2部分:1,带有导出转发器= C++的DLL(VS),它还有自定义函数作为存根,动态加载和调用Delphi中的#2;2.DLL中的函数-提供自定义函数。当然,在Delphi中实现#2只是为了节省时间。Delphi不支持此功能,但C++Builder支持.def文件来声明
导出
,尽管我不知道它是否支持转发。是的。MSVC支持转发导出。你能澄清一下“后处理”是什么意思吗?~可能是将delphi代码编译成.obj,然后将其提供给MS build tool?不。我的意思是修改可执行文件并在元数据中重新写入PE导出表。你可能需要自己编写该工具。
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