Полезная информация

Многие проблемы быстрее решаются поиском по форуму и чтением FAQ, чем созданием новой темы и томительным ожиданием ответа.

№126-10-2010 20:37:40

ber5erk
Участник
 
Группа: Members
Зарегистрирован: 26-10-2010
Сообщений: 2
UA: Firefox 3.6

Открытие XUL-окна из XPCOM компонента на C++

Здравствуйте.

Столкнулся с такой проблемой - пишу XPCOM-компонент на С++, так вот из под него
нужно иметь возможность открыть XUL-окно.
Использую такой код:

  nsresult rv;

  nsCOMPtr<nsIWindowWatcher> myDialog( do_GetService( "@mozilla.org/embedcomp/window-watcher;1", &rv ) );
  if( NS_FAILED( rv ) )
  {
    MessageBoxA( 0, "1", "Error", MB_OK );
    return NULL;
  }

  nsCOMPtr<nsIDOMWindow> win;
  rv = myDialog->OpenWindow( nsnull, "chrome/content/TestWindow.xul", "OCC", "resizeable,centerscreen", nsnull, getter_AddRefs(win) );
  if ( NS_FAILED( rv ) )
    MessageBoxA( 0, "2", "Error", MB_OK );

  myDialog->SetActiveWindow( win );

Но, к сожалению, никакого окна не отображается (MessageBox-ы с ошибками не выводятся).
TestWindow.xul заведомо рабочий. По документации Mozilla искал, но толком ничего
не нашел.
Может кто-нибудь что-либо посоветовать по этому поводу?

Заранее спасибо.

Отсутствует

 

№228-10-2010 20:35:37

ber5erk
Участник
 
Группа: Members
Зарегистрирован: 26-10-2010
Сообщений: 2
UA: Firefox 3.6

Re: Открытие XUL-окна из XPCOM компонента на C++

Сделал тестовый JavaScript XPCOM компонент - результат тот же.
Использую следующий код:

const MYCOMPONENT_CONTRACTID = '@mozilla.org/MyComponent;1';
const MYCOMPONENT_CID = Components.ID('{E7759D3B-4C5C-48df-B7D2-6EAC09BB980D}');
const MYCOMPONENT_IID = Components.interfaces.nsIMyComponent;

function nsMyComponent() { }

nsMyComponent.prototype = {
    reverseIt: function(s) {
        var a = s.split("");
        a = a.reverse();

    var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
                                      .getService(Components.interfaces.nsIPromptService);

        var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
                           .getService(Components.interfaces.nsIWindowWatcher);
        var win = ww.openWindow(null, "chrome/content/TestWindow.xul",
                                "Test", "chrome,resizable,centerscreen,dependent,dialog", null);

    promptService.alert( null, "Title", win );

        return a.join("");
    },
    QueryInterface: function(iid) {
        if (!iid.equals(Components.interfaces.nsISupports) &&
            !iid.equals(MYCOMPONENT_IID))
            throw Components.results.NS_ERROR_NO_INTERFACE;
        return this;
    }
};

var nsMyComponentFactory = {
    createInstance: function(outer, iid) {
        if (outer != null)
            throw Components.results.NS_ERROR_NO_AGGREGATION;
        if (!iid.equals(MYCOMPONENT_IID) &&
            !iid.equals(Components.interfaces.nsISupports))
            throw Components.results.NS_ERROR_INVALID_ARG;
        return new nsMyComponent();
    }
};

var nsMyComponentModule = {
    registerSelf: function(compMgr, fileSpec, location, type) {
        compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
        compMgr.registerFactoryLocation(MYCOMPONENT_CID,
                                        "MyComponent test",
                                        MYCOMPONENT_CONTRACTID,
                                        fileSpec,
                                        location,
                                        type);
    },
    getClassObject: function(compMgr, cid, iid) {
        if (!cid.equals(MYCOMPONENT_CID))
            throw Components.results.NS_ERROR_NO_INTERFACE;
        if (!iid.equals(Components.interfaces.nsIFactory))
            throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
        return nsMyComponentFactory;   
    },
    canUnload: function(compMgr){
        return true; }
};

function NSGetModule(comMgr, fileSpec) {
    return nsMyComponentModule; }

Что интересно - при запуске метода компонента фокус с основного окна Firefox
снимается, т.е. якобы что-то создается. Перепробовал множество комбинаций
параметров OpenWindow - все одно. Как оно вообще работает? - везде во всех
примерах такой же подход, как и у меня. При вызове window.open() с путем до
XUL-файла не из-под XPCOM-компонента форма нормально отображается. Есть
здесь люди, знающие и работающие с XPCOM, которые могут ответить на мои
вопросы?

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]