gpt4 book ai didi

delphi - 将mozilla的NSModule移植到Delphi

转载 作者:行者123 更新时间:2023-12-02 04:21:35 25 4
gpt4 key购买 nike

扩展至this问题,我想我会最好地展示我到目前为止所得到的。我想做的是用 Delphi 创建一个 Firefox 扩展,它将与 future 的 Firefox 版本一起使用,它将使用导出的 NSModule 结构,而不再是 NSGetModule 函数。

我目前遇到的主要问题是:

  • 下面的代码正确吗?我可能对指针和记录数组的工作方式有误。
  • 如何调试这个?如果我构建它并且它运行,那么我确信它会工作,但是在调试我的库时,我只能检查我的初始化代码是否完成其工作。 (目前,Firefox 3.6 似乎没有接受我的 @mozilla.org/network/protocol;1?name=xxm 契约(Contract))

我尝试移植的代码在这里: 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;

最佳答案

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

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

我假设您已将 nsISupports 声明为 Delphi 接口(interface)。否则,您需要确保上面的 aOuter 参数是一个指针,就像在 C++ 代码中一样。

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

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

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

关于delphi - 将mozilla的NSModule移植到Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4280400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com