【问题标题】:Gecko NSModule: ContractIDEntry "nsID const *"?Gecko NSModule:ContractIDEntry “nsID const *”?
【发布时间】:2010-10-31 21:21:33
【问题描述】:

我创建了一个 FireFox 插件,但发现它在 FireFox 3.6 上停止工作 显然,NSGetModule 正在被 NSModule 结构所取代,所以我必须适应。 我正在使用 Delphi 对我的产品进行编码,因此我必须将新代码移植到 Object Pascal。

如果我查看这段代码: http://mxr.mozilla.org/mozilla-central/source/xpcom/components/Module.h

我注意到 ContractIDEntry 结构的“cid”属性定义为nsID const *

这是否意味着结构中有一个指向 nsID 变量的指针, 或者 nsID 值本身就是结构的一部分?

【问题讨论】:

    标签: delphi firefox-addon xpcom gecko firefox3.6


    【解决方案1】:

    完整的声明如下:

    struct ContractIDEntry
    {
      const char* contractid;
      nsID const * cid;
    };
    

    正如contractid 的声明意味着该结构包含一个指向字符的指针而不是该字符是该结构的一部分,cid 的声明意味着该结构包含一个指向 nsID 的指针。该结构不包含 nsID,仅包含一个指针。

    从技术上讲,它是一个不允许用来修改指向值的指针,但Delphi没有这个概念,所以将它声明为一个普通的指针。

    【讨论】:

    • 谢谢你,我会检查我是否能让这个工作。奇怪的是,Mozilla 的人将 NSGetModule 更改为 NSModule '不必加载模块以使其注册自身',但我必须调用初始化代码,以便我可以初始化记录,不要一世? IT 以这种方式在我的 Apache 模块上工作...
    • Mozilla 的改变是一种回归。它要求编译器支持导出 data 而不仅仅是导出 functions。以前,你会导出一个函数,宿主程序会调用它来获取插件信息。现在,您必须导出一个变量;主机可以在不执行初始化函数的情况下加载您的模块,查找导出变量的地址,并读取那里的静态数据。 Delphi 无法导出变量,因此您不能再在 Delphi(或任何其他工具)中编写附加组件。我邀请您向 Mozilla 提交错误报告。
    • 原来调用了 DLL 的初始化代码,所以我可以从 Delphi(很像 Apache)初始化导出的记录!不过,还有一个问题是const CIDEntry* mCIDs(以及后续)是一个指针数组,或者是一个 CIDEntry 数组,如果是后者,{NULL} 是一个所有字节/位都设置为 0 的 CIDEntry?
    • 任何以* 结尾的都是指针。它可能是指向数组第一个元素的指针,也可能是指向某事物的指针。我希望 Mozilla 文档会告诉你哪个。使用{NULL} 初始化的结构将其第一个元素设置为空指针,其余元素获取它们的“默认”值,通常为0falseNULL。使用{NULL} 初始化的数组将其第一个元素设置为空指针,其余元素(如果有)获取它们的默认值,也就是空指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2010-10-03
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多