在C/C++中,可以创建一个DLL,在该DLL中将一些导出函数转发到其他DLL(而不使用存根加载器):
或者,作为替代方案 - 使用.def文件:
这段代码可编译且可运行:
生成的操作码如下:
那么,将一些仅限于C/C++的编译器魔法进行真正的转发是可能的吗?或者在Delphi中也可以实现吗?
#pragma comment(linker, "/export:TestFunc=Real_Lib.dll.TestFunc")
或者,作为替代方案 - 使用.def文件:
EXPORTS
TestFunc=c:/Real_Lib.dll.TestFunc
注意缺少参数或返回类型。
例如,对于kernel32.dll
的DependencyWalker
中,您可以看到这个:
问题: - 您能否在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
。尽管DependencyWalker
将其显示为常规导出项,其实只是调用了导入函数:
![](https://i.imgur.com/5xSXeLb.jpg)
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
那么,将一些仅限于C/C++的编译器魔法进行真正的转发是可能的吗?或者在Delphi中也可以实现吗?
当然,将第二部分实现在Delphi中只是为了节省时间。