Как зарегистрировать интерфейс компонента в wxwebconnect? - PullRequest
1 голос
/ 02 ноября 2010

Я провожу эксперимент с wxWebConnect тестовым приложением, включающим учебник xpcom по адресу "http://nerdlife.net/building-a-c-xpcom-component-in-windows/"

Я адаптирую класс 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()

возвращает созданный экземпляр.

Второе предупреждение говорит «undefined», поэтому интерфейс nsIMyComponent не распознается XULRunner. Как динамически зарегистрировать интерфейс nsIMyComponent в среде wxWebConnect?

Thx

1 Ответ

1 голос
/ 11 ноября 2010

Я не уверен, что здесь происходит. Первое, что я хотел бы проверить, это то, что ваш компонент является сценарием (я полагаю, что это так, поскольку демонстрационная версия, с которой вы копируете). Следующее, что я хотел бы проверить, - можете ли вы создавать экземпляры других стандартных компонентов XULRunner и получать их интерфейс (попробуйте что-то вроде «alert ('Components.interfaces.nsIFile');»; - по крайней мере в моей версии wxWebConnect это показывает окно предупреждения со строкой "nsIFile".

Кроме того, я думаю, что стоит проверить консоль ошибок, чтобы убедиться в отсутствии ошибок или предупреждений. Волшебная строка для этого (в Javascript):

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