В дополнение к этому вопросу, думаю, лучше всего показать, что у меня есть уже. Что я пытаюсь сделать, так это создать расширение Firefox с Delphi, которое будет работать с версиями Firefox будущего, которые будут использовать экспортированную структуру NSModule, а не функцию NSGetModule.
Основные вопросы, с которыми я борюсь на данный момент:
- Верен ли приведенный ниже код? Я могу ошибаться в том, как работают указатели и массивы записей.
- Как это отладить? Если я соберу его и он запустится, я почти уверен, что он будет работать, но при отладке моей библиотеки я могу только проверить, выполняет ли мой код инициализации свою работу. (и на данный момент 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;