Delphi - 使用转发导出创建 DLL

标签 delphi dll

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

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

或者使用 .def 文件:

EXPORTS
   TestFunc=c:/Real_Lib.dll.TestFunc

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

例如 - 在 kernel32.dllDependencyWalker 中 - 您可以看到以下内容: KERNEL32.AddVectoredExceptionHandler => ntdll.AddVectoredExceptionHandler



问题: - 你能在 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/

相关文章:

delphi - 在 Windows 中存储密码的安全方法

delphi - 如何在 Delphi 中动态调用命名过程或函数

c# - 如何解决使用.net core 3.0加载互操作dll时找不到文件的问题?

c# - 将一些dll编译成另一个dll

windows - 从剪裁区域中排除圆角矩形?

Delphi:高效快速的 Unicode 文本搜索

C++ Win32 未处理的异常处理程序

c# - 从 C++ DLL 中编写的 C++ 方法返回数据到 C#

Delphi firemonkey进程间通信有可能吗?

delphi - Delphi中使用 "with"创建的引用对象实例