Je fais une expérience avec application de test wxWebConnect, incorporant le tutoriel xpcom à "http://nerdlife.net/building-ac-xpcom-component-in-windows/"Comment enregistrer une interface de composant dans wxwebconnect?
classe I adapter au besoin MyComponent pour compiler avec TestApp.exe (pas comme dll séparée), et sur MyApp :: OnInit Je les lignes suivantes:
ns_smartptr<nsIComponentRegistrar> comp_reg;
res = NS_GetComponentRegistrar(&comp_reg.p);
if (NS_FAILED(res))
return false;
ns_smartptr<nsIFactory> prompt_factory;
CreateMyComponentFactory(&prompt_factory.p);
nsCID prompt_cid = MYCOMPONENT_CID;
res = comp_reg->RegisterFactory(prompt_cid,
"MyComponent",
"@mozilla.org/mycomp;1",
prompt_factory);
Ces lignes sont copiées à partir de GeckoEngine :: Init(), en utilisant le même mécanisme de register PromptService, etc. Le code se compile bien et testapp.exe s'exécute comme prévu.
je mets javascript test ci-dessous:
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
const cid = "@mozilla.org/mycomp;1";
obj = Components.classes[cid].createInstance();
alert(typeof obj);
// bind the instance we just created to our interface
alert(Components.interfaces.nsIMyComponent);
obj = obj.QueryInterface(Components.interfaces.nsIMyComponent);
} catch (err) {
alert(err);
return;
}
et obtenir l'exception suivante: Impossible de convertir l'argument JavaScript arg 0 [nsISupport.QueryInterface]
La première alerte dit "objet", donc la ligne
Components.classes[cid].createInstance()
renvoie l'instance créée. La seconde alerte indique "non défini", l'interface nsIMyComponent n'est donc pas reconnue par XULRunner. Comment enregistrer dynamiquement l'interface nsIMyComponent dans un environnement wxWebConnect?
Thx