2010-11-02 3 views
1

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

Répondre

1

Je ne suis pas sûr de ce qui se passe ici. La première chose que je vérifie est que votre composant est scriptable (je suppose que c'est, puisque la démo que vous copiez est). La prochaine chose que je voudrais vérifier est de savoir si vous pouvez instancier d'autres composants XULRunner standard et obtenir leur interface (essayez quelque chose comme "alert ('Components.interfaces.nsIFile');" - au moins dans ma version de wxWebConnect cela montre une boîte d'alerte . avec string « nsIFile »

aussi, je pense qu'il serait utile de vérifier l'erreur de la console pour vous assurer qu'il n'y a pas d'erreurs ou avertissements ont rapporté une chaîne magique pour le faire (en Javascript) est la suivante:.

window.open('chrome://global/content/console.xul', '', 'chrome,dialog=no,toolbar,resizable'); 
Questions connexes