Delphi - 使用转发导出创建DLL

时间:2015-10-10 14:15:52

标签: delphi dll

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

#pragma comment(linker, "/export:TestFunc=Real_Lib.dll.TestFunc")

或者 - 使用.def文件:

EXPORTS
   TestFunc=c:/Real_Lib.dll.TestFunc

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

例如 - 在DependencyWalker kernel32.dll中 - 您可以看到: KERNEL32.AddVectoredExceptionHandler => ntdll.AddVectoredExceptionHandler



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

基本上,想法是生成只包含某些函数的DLL包装器,并转发其余的函数 - 而不必为所有导出的函数创建存根加载器(带参数,返回类型等)。


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

示例(TestProgram - >转发器 - > 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.


=这编译并运作: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 ++编译器的魔法还是可能的呢?

1 个答案:

答案 0 :(得分:1)

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