在this问题的扩展中,我想我最能展示到目前为止我所拥有的内容。 我要做的是用Delphi创建一个Firefox扩展,它将适用于未来的Firefox版本,它将使用导出的NSModule结构,而不再是NSGetModule函数。
我目前正在努力解决的主要问题是:
@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;
答案 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类中的类字段,但我不认为记录提供该功能。将它设为单位级变量而不是字段。