在 C/C++ 中,可以创建一个 DLL,其中一些导出函数被转发到其他一些 DLL(不使用 stub 加载程序):
#pragma comment(linker, "/export:TestFunc=Real_Lib.dll.TestFunc")
或者使用 .def 文件:
EXPORTS
TestFunc=c:/Real_Lib.dll.TestFunc
(注意缺少参数或返回类型)。
例如 - 在 kernel32.dll
的 DependencyWalker
中 - 您可以看到以下内容:
问题: - 你能在 Delphi 中为 DLL 实现类似的结果吗? (必须使用 CLI 编译器就可以了..)
基本想法是生成仅重载某些函数并转发其余函数的 DLL 包装器 - 无需为所有导出函数(带有参数、返回类型等)创建 stub 加载器。
注意:
我知道您实际上可以省略引用 import = 大改进的导出函数的方法参数..
但仍然需要指定正确的方法类型(过程/函数)、返回类型(函数)和调用约定。
示例(测试程序 -> 转发器 -> Real_DLL):
真正的 DLL 文件 - 只是您的常规 dll:
library Real_Lib;
function TestFunc(a, b: Integer): Integer; stdcall;
begin
Result := a+b;
end;
exports TestFunc;
begin
end.
Forwarder 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
那么 - 转发一些仅 C/C++ 的编译器魔法是真的还是在 Delphi 中也可能?
最佳答案
Delphi 无法创建此类可执行文件。如果您想从 Delphi 创建这样的 DLL,则需要执行一些后处理。
关于Delphi - 使用转发导出创建 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33054945/