将Mozilla的NSModule移植到Delphi

时间:2010-11-25 19:43:58

标签: delphi firefox-addon xpcom

this问题的扩展中,我想我最能展示到目前为止我所拥有的内容。 我要做的是用Delphi创建一个Firefox扩展,它将适用于未来的Firefox版本,它将使用导出的NSModule结构,而不再是NSGetModule函数。

我目前正在努力解决的主要问题是:

  • 以下代码是否正确?关于指针和记录数组如何工作,我可能错了。
  • 如何调试?如果我构建它并运行它然后我确定它会工作,但在调试我的库时我只能检查我的init代码是否能完成它的工作。 (目前,Firefox 3.6似乎没有拿起我的@mozilla.org/network/protocol;1?name=xxm合同)

我想要移植的代码在这里: http://mxr.mozilla.org/mozilla-central/source/xpcom/components/Module.h

type
  TConstructorProcPtr=function(aOuter:nsISupports;const aIID:TGUID;var aResult:pointer):nsresult;
  TLoadFuncPrt=function:nsresult;
  TUnloadFuncPrt=procedure;
  TCIDEntry=record
    cid:TGUID;
    service:boolean;
    getFactoryProc:pointer;//TGetFactoryProcPtr;
    constructorProc:TConstructorProcPtr;
  end;
  TContractIDEntry=record
    contractid:PChar;
    cid:TGUID;//PGUID?
  end;
  TCategoryEntry=record
    category,entry,value:PChar;
  end;

  TXPCOMModule=packed record
    kVersion:integer;//=1;
    mVersion:cardinal;//kModuleVersion
    mCIDs:^TCIDEntry;//pointer to first in array, last should be nil
    mContractIDs:^TContractIDEntry;//pointer to first in array, last should be nil
    mCategoryEntries:^TCategoryEntry;//pointer to first in array, last should be nil
    getFactoryProcPtr:pointer;//TGetFactoryProcPtr;
    loadProc:TLoadFuncPrt;
    unloadProd:TUnloadFuncPrt;
  end;

1 个答案:

答案 0 :(得分:1)

您几乎肯定需要在所有过程和函数指针声明上使用cdecl调用约定:

TConstructorProcPtr = function(aOuter: nsISupports; const aIID: TGUID; var aResult: Pointer): nsresult; cdecl;
TLoadFuncPrt = function: nsresult; cdecl;
TUnloadFuncPrt = procedure; cdecl;

我假设您已将nsISupports声明为Delphi接口。否则,您需要确保上面的aOuter参数是C ++代码中的指针。

对于TContractIDEntry以及您使用PChar的所有其他地方,我建议您改用PAnsiChar。 Delphi的Char类型的大小在几年前发生了变化,但C ++ char始终是一个字节,因此请明确使用Delphi的单字节字符类型。此外,您的评论想知道是否将cid字段声明为PGUID是正确的;星号表示指针。

TContractIDEntry = record
  contractid: PAnsiChar;
  cid: PGUID;
end;

kVersion字段不应该是您声明的记录的成员。在C ++中,它是静态成员,这意味着它在结构本身中不占用空间;它由该类型的所有实例共享。它等同于Delphi类中的类字段,但我不认为记录提供该功能。将它设为单位级变量而不是字段。