在C / C ++中,可以创建一个DLL,在其中将某些导出功能转发到其他DLL(无需使用存根加载器):
#pragma comment(linker, "/export:TestFunc=Real_Lib.dll.TestFunc")
或者使用-def文件:
EXPORTS
TestFunc=c:/Real_Lib.dll.TestFunc
(注意缺少参数或返回类型)。
例如-在-中DependencyWalker
,kernel32.dll
您可以看到以下内容:
问题: -您可以在Delphi中为DLL获得类似的结果吗?(必须使用CLI编译器是可以的。)
基本上,想法是生成仅使某些功能过载的DLL包装器,并转发其余功能-无需为所有导出的功能(带有参数,返回类型等)创建存根加载器。
注意:我知道您实际上可以忽略导出函数的方法参数,该参数涉及import =很大的改进..
但是仍然需要指定正确的方法类型(过程/函数),返回类型(用于函数)和调用约定。
真正的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] 删除。
我来说两句