Delphi-使用转发的导出创建DLL

巨乳

在C / C ++中,可以创建一个DLL,在其中将某些导出功能转发到其他DLL(无需使用存根加载器):

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

或者使用-def文件:

EXPORTS
   TestFunc=c:/Real_Lib.dll.TestFunc

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

例如-在-中DependencyWalkerkernel32.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显示为常规导出,只是调用了import函数:

并生成这些操作码:

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,则需要执行一些后处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章