加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi – 使用转发导出创建DLL

发布时间:2020-12-15 09:46:31 所属栏目:大数据 来源:网络整理
导读:在C/C++中,可以创建一个DLL,其中一些导出函数被转发到其他DLL(不使用存根加载器): #pragma comment(linker,"/export:TestFunc=Real_Lib.dll.TestFunc") 或者 – 使用.def文件: EXPORTS TestFunc=c:/Real_Lib.dll.TestFunc (注意缺少参数或返回类型). 例如
在C/C++中,可以创建一个DLL,其中一些导出函数被转发到其他DLL(不使用存根加载器):

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

或者 – 使用.def文件:

EXPORTS
   TestFunc=c:/Real_Lib.dll.TestFunc

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

例如 – 在DependencyWalker for kernel32.dll中 – 您可以看到:

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

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

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

样本(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.

转发器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

那么 – 在Delphi中转发一些只有C/C++编译魔术还是可能的呢?

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读