Delphi - 使用转发导出创建DLL

meg*_*lis 5 delphi dll

在C/C++中,可以创建一个DLL,其中一些导出函数被转发到其他DLL(不使用存根加载器):

#pragma comment(linker, "/export:TestFunc=Real_Lib.dll.TestFunc")
Run Code Online (Sandbox Code Playgroud)

或者 - 使用.def文件:

EXPORTS
   TestFunc=c:/Real_Lib.dll.TestFunc
Run Code Online (Sandbox Code Playgroud)

(注意缺少参数返回类型).

例如 - 在DependencyWalkerfor kernel32.dll- 你可以看到: KERNEL32.AddVectoredExceptionHandler => ntdll.AddVectoredExceptionHandler



问题: - 你能在Delphi中实现类似的DLL结果吗?(必须使用CLI编译器才行..)

基本上,想法是生成仅包含某些函数的DLL包装器,并转发其余的函数 - 无需为所有导出的函数创建存根加载器(使用参数,返回类型等).



注意: 我知道你实际上可以省略导出函数的方法参数,这些参数指的是import = 大改进.
但是仍然需要指定正确的方法类型(过程/函数),返回类型(用于函数)和调用约定.


示例(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.
Run Code Online (Sandbox Code Playgroud)

转发器DLL - "转发"导出的函数到静态导入:

library Forwarder;
function TestFunc: Integer; stdcall; external 'Real_Lib.dll';
exports TestFunc;
begin
end.
Run Code Online (Sandbox Code Playgroud)

=注意参数可以被省略.
但是 - 仍然需要指定函数返回类型.

测试程序 - 使用转发器DLL:

program TestProgram;
{$APPTYPE CONSOLE}
function TestFunc(a, b: Integer): Integer; stdcall; external 'Forwarder.dll';
begin
  Writeln('Result: ', TestFunc(2, 7));
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)


=这编译和工作: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
Run Code Online (Sandbox Code Playgroud)


那么 - 真的转发一些C/C++只有编译器魔法或Delphi中可能吗?

Dav*_*nan 1

Delphi 无法创建此类可执行文件。如果您想从 Delphi 创建这样的 DLL,则需要执行一些后处理。