1

我正在使用wxWebConnect测试应用程序进行实验,并在“http://nerdlife.net/building-ac-xpcom-component-in-windows/”中加入 xpcom 教程

我根据需要调整 MyComponent 类以与 testapp.exe (而不是单独的 dll)一起编译,并且在 MyApp::OnInit 上我有以下几行:

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);

这些行是从 GeckoEngine::Init() 复制的,使用相同的机制来注册 PromptService 等。代码编译良好,并且 testapp.exe 按预期运行。

我将javascript测试如下:

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;
}

并得到以下异常:无法转换 JavaScript 参数 arg 0 [nsISupport.QueryInterface]

第一个警报说“对象”,所以该行

Components.classes[cid].createInstance()

正在返回创建的实例。

第二个警报显示“未定义”,因此 XULRunner 无法识别接口 nsIMyComponent。如何在 wxWebConnect 环境中动态注册 nsIMyComponent 接口?

谢谢

4

1 回答 1

1

我不确定这里发生了什么。我要检查的第一件事是您的组件是可编写脚本的(我认为是可编写脚本的,因为您从中复制的演示是)。接下来我要检查的是您是否可以实例化其他标准 XULRunner 组件并获取它们的接口(尝试类似“alert('Components.interfaces.nsIFile');”之类的东西)——至少在我的 wxWebConnect 版本中,这会显示一个警告框带有字符串“nsIFile”。

此外,我认为值得检查错误控制台以确保没有报告错误或警告。执行此操作的魔术字符串(在 Javascript 中)是:

window.open('chrome://global/content/console.xul', '', 'chrome,dialog=no,toolbar,resizable');
于 2010-11-11T14:09:35.173 回答