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

从Delphi DLL导出全局符号

发布时间:2020-12-15 03:56:08 所属栏目:大数据 来源:网络整理
导读:我试图在Delphi中创建一个Gecko 2.0兼容的DLL. 以前(前Gecko 2.0)导出NSGetModule()函数所需的DLL.这完美无瑕. 从Firefox 4开始,我的DLL被加载(我已经通过我的初始化部分中的断点验证了这一点),但是我的NSGetModule()函数不再被调用了.这是设计的行为,因为从
我试图在Delphi中创建一个Gecko 2.0兼容的DLL.

以前(前Gecko 2.0)导出NSGetModule()函数所需的DLL.这完美无瑕.

从Firefox 4开始,我的DLL被加载(我已经通过我的初始化部分中的断点验证了这一点),但是我的NSGetModule()函数不再被调用了.这是设计的行为,因为从Gecko 2.0(Firefox 4)开始,二进制组件不应该导出NSGetModule()函数:

https://developer.mozilla.org/en/XPCOM/XPCOM_changes_in_Gecko_2.0#Binary_components

根据这些文档,我的DLL需要导出指向一个结构体的NSModule数据符号.在Delphi术语中,我认为这是一个全局变量,它指向Delphi记录.

在C中,这是如何导出(全局)数据符号:

define NSMODULE_DEFN(_name) extern "C" NS_EXPORT mozilla::Module const *const NSModule

我的问题:如何在Delphi中完成这个?如何导出全局变量?

感谢您的反馈.

解决方法

Delphi以类似于导出函数的方式从DLL导出全局变量:
library exp;
var
  global: Integer;
exports global;
end.

Delphi可以从DLL导入全局变量,但它有点黑客:声明与导入全局相同名称的DLL导入过程,然后获取过程的地址并进行适当调整.从Delphi的角度看,DLL导入的程序是通过DLL导入表进行间接跳转的存根.导出的变量由OS加载器链接,将导出的全局地址放在导入表中,几乎完全像导出过程的地址类似于修补.

例如:

{$apptype console}

procedure global; external 'exp.dll';

function GetGlobalAddr: PInteger;
type
  PPPointer = ^PPointer;
var
  p: PByte;
begin
  p := @global;
  Assert(p^ = $FF); // $FF $25 => indirect jump m32
  Inc(p);
  Assert(p^ = $25);
  Inc(p);
  Result := PPPointer(p)^^
end;

begin
  Writeln(GetGlobalAddr^);
end.

当然,后面的细节是实现和平台依赖的.可能一个更安全的方法是使用LoadLibrary与GetProcAddress,它会在传递其名称时返回全局变量的地址.当然这也是平台依赖的.

64位更新:

在Windows 64位中,代码略有不同.操作码是相同的,但是相同指令序列的寻址模式是不同的;而不是一个32位的绝对偏移量,它是一个32位的相对偏移量.

function GetGlobalAddr: PInteger;
type
  PPPointer = ^PPointer;
var
  p: PByte;
  ofs: Integer;
begin
  p := @global;
  Assert(p^ = $FF); // $FF $25 => indirect jump m32
  Inc(p);
  Assert(p^ = $25);
  Inc(p);
  // 32-bit offset follows
  ofs := PInteger(p)^;
  // offset is relative to next instruction
  Inc(p,SizeOf(ofs) + ofs);
  Result := PPPointer(p)^^
end;

(编辑:李大同)

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

    推荐文章
      热点阅读