Страницы: 1
Здравствуйте.
Столкнулся с такой проблемой - пишу 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 искал, но толком ничего
не нашел.
Может кто-нибудь что-либо посоветовать по этому поводу?
Заранее спасибо.
Отсутствует
Сделал тестовый 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, которые могут ответить на мои
вопросы?
Отсутствует
Страницы: 1