Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-使用转发导出创建DLL_Delphi_Dll - Fatal编程技术网

Delphi-使用转发导出创建DLL

Delphi-使用转发导出创建DLL,delphi,dll,Delphi,Dll,在C/C++中,可以创建一个DLL,其中一些导出函数被转发到另一个DLL(无需使用存根加载器): 或者使用.def文件: EXPORTS TestFunc=c:/Real_Lib.dll.TestFunc (注意缺少参数或返回类型) 例如,在kernel32.dll的DependencyWalker中,您可以看到: ntdll.AddVectoredExceptionHandler“> 问题:-您能在Delphi中为DLL获得类似的结果吗?(可以使用CLI编译器) 其基本思想是生成只

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

或者使用.def文件:

EXPORTS
   TestFunc=c:/Real_Lib.dll.TestFunc
(注意缺少参数返回类型

例如,在
kernel32.dll
DependencyWalker
中,您可以看到: ntdll.AddVectoredExceptionHandler“>



问题:-您能在Delphi中为DLL获得类似的结果吗?(可以使用CLI编译器)

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



注意: 我知道您实际上可以为引用import=大改进的导出函数ommit方法参数。
但仍然需要指定正确的方法类型(过程/函数)、返回类型(函数)和调用约定


示例(TestProgram->Forwarder->Real\u 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
00403E82.E8 7DFFFFFF调用
00403E04$-FF25 20614000 JMP DWORD PTR DS:[];Forwarde.TestFunc
00383810 F>-FF25 08613800 JMP DWORD PTR DS:[];Real_Lib.TestFunc


那么,在Delphi中,是否真的转发一些C/C++编译器的魔法或是可能的?

< P> delphi不能创建这样的可执行文件。如果你想用Delphi创建这样的DLL,你需要执行一些后处理。< /P>这不是C或C++的一个特性,但它可能是微软编译器的一个特点。我怀疑Delphi能做S。我最终把它分成2部分:1,带有导出转发器= C++的DLL(VS),它还有自定义函数作为存根,动态加载和调用Delphi中的#2;2.DLL中的函数-提供自定义函数。当然,在Delphi中实现#2只是为了节省时间。Delphi不支持此功能,但C++Builder支持.def文件来声明
导出
,尽管我不知道它是否支持转发。是的。MSVC支持转发导出。你能澄清一下“后处理”是什么意思吗?~可能是将delphi代码编译成.obj,然后将其提供给MS build tool?不。我的意思是修改可执行文件并在元数据中重新写入PE导出表。你可能需要自己编写该工具。
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