在C / C ++中,可以创建一个DLL,其中一些导出函数被转发到其他DLL(不使用存根加载器):
#pragma comment(linker, "/export:TestFunc=Real_Lib.dll.TestFunc")
或者 - 使用.def文件:
EXPORTS
TestFunc=c:/Real_Lib.dll.TestFunc
(注意缺少参数或返回类型)。
例如 - 在DependencyWalker
kernel32.dll
中 - 您可以看到:
问题: - 你能在Delphi中实现类似的DLL结果吗? (必须使用CLI编译器才行。)
基本上,想法是生成只包含某些函数的DLL包装器,并转发其余的函数 - 而不必为所有导出的函数创建存根加载器(带参数,返回类型等)。
注意:
我知道你实际上可以省略导出函数的方法参数,这些函数引用import = 大改进 ..
但仍需要指定正确的方法类型(过程/函数),返回类型(用于函数)和调用约定。
真正的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.
=这编译并运作:Result: 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
那么 - 在Delphi中转发一些只有C / C ++编译器的魔法还是可能的呢?
答案 0 :(得分:1)
Delphi无法创建此类可执行文件。如果要从Delphi创建这样的DLL,则需要执行一些后处理。