Xpoint
   [напомнить пароль]

nsIWebNavigation LoadUri failed

Метки: [без меток]
2008-08-22 18:38:43 [обр] Lermontov[досье]

В моем standalone приложении на движке gecko функция LoadURI интерфейса nsIWebNavigation возвращает ошибку NS_ERROR_OUT_OF_MEMORY.

Сборка осуществяется с помощью Visual Studio 7.1. Для сборки использую xulrunner 1.9.Опции компилятора: включена поддержка mfc,charaster set = Use Unicode Character Set,
Command line(C\C++):
/Od /I "C:\CL\cl4\\" /I "C:\CL\cl4\\XulRunner-sdk\include\xpcom" /I "C:\CL\cl4\\XulRunner-sdk\include\string" /I "C:\CL\cl4\\XulRunner-sdk\include\embed_base" /I "C:\CL\cl4\\XulRunner-sdk\include\webbrwsr" /I "C:\CL\cl4\\XulRunner-sdk\include\webshell" /I "C:\CL\cl4\\XulRunner-sdk\include\windowwatcher" /I "C:\CL\cl4\\XulRunner-sdk\include\profile" /I "C:\CL\cl4\\XulRunner-sdk\include\necko" /I "C:\CL\cl4\\XulRunner-sdk\include\docshell" /I "C:\CL\cl4\\XulRunner-sdk\include\dom" /I "C:\CL\cl4\\XulRunner-sdk\include\widget" /I "C:\CL\cl4\\XulRunner-sdk\include\uriloader" /I "C:\CL\cl4\\XulRunner-sdk\include\shistory" /I "C:\CL\cl4\\XulRunner-sdk\include\webbrowserpersist" /I "C:\CL\cl4\\XulRunner-sdk\include\profdirserviceprovider" /I "C:\CL\cl4\\XulRunner-sdk\include\xulapp" /I "C:\CL\cl4\\XulRunner-sdk\include\nspr" /I "C:\CL\cl4\\XulRunner-sdk\include" /D "WIN32" /D "_WINDOWS" /D "_DEBUG" /D "_AFXEXT" /D "_EXPORTS" /D "XPCOM_GLUE" /D "MOZ_DEBUG" /D "_WINDLL" /D "_AFXDLL" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /GR /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP

Command line(Linker):
/OUT:"..\_Debug/WebBrowserPreview.dll" /INCREMENTAL /NOLOGO /LIBPATH:"C:\CL\cl4\\xulrunner-sdk\lib" /LIBPATH:"C:\CL\cl4\\profile\dirserviceprovider\standalone" /DLL /DEF:".\WebBrowserPreview.def" /DEBUG /PDB:"..\_Debug/WebBrowserPreview.pdb" /SUBSYSTEM:WINDOWS /IMPLIB:"..\_Debug/WebBrowserPreview.lib" /MACHINE:X86 string_s.lib xpcomglue.lib nspr4.lib profdirserviceprovidersa_s.lib "\Cl\cl4\xulrunner-sdk\lib\string_s.lib" "\Cl\cl4\xulrunner-sdk\lib\xpcomglue.lib" "\Cl\cl4\xulrunner-sdk\lib\nspr4.lib"

int InitGecko(CL::SDK::IApplication* pApp)
{
   //
   nsresult rv = 0;
   CL::SDK::IMainFrame* pIFrm = pApp->GetMainFrame();
   CFrameWnd* pFrm = dynamic_cast<CFrameWnd*>(pIFrm);
   m_hInstanceApp = GetModuleHandle(NULL);

   static const GREVersionRange vr = {
      "1.8a1",
         PR_TRUE,
         "2.0",
         PR_FALSE
   };

   char* MozillaPath;
   MozillaPath = MOZILLA_DLLS_PATH;

   char xpcomDll[_MAX_PATH];

   _snprintf(xpcomDll, sizeof(xpcomDll), "%sxpcom.dll", MozillaPath);

   
rv = XPCOMGlueStartup(xpcomDll);
   if (NS_FAILED(rv))
      return 3;
    //rv = NS_InitEmbedding(nsnull, nsnull);
   WCHAR *xulPath;
   char xulDll[_MAX_PATH];
   _snprintf(xulDll, sizeof(xulDll), "%sxul.dll", MozillaPath);
   CCommonString::ToWideString(xulDll,xulPath);
   HINSTANCE xulModule = LoadLibraryEx(xulPath, NULL, 0);
   if (!xulModule)
      return 4;

    
WCHAR temp[_MAX_PATH];
   GetModuleFileName(xulModule, temp, sizeof(temp));
    
XRE_InitEmbedding =
      (XRE_InitEmbeddingType) GetProcAddress(xulModule, "XRE_InitEmbedding");
   if (!XRE_InitEmbedding)
        return 5;

   XRE_TermEmbedding =
      (XRE_TermEmbeddingType) GetProcAddress(xulModule, "XRE_TermEmbedding");
   if (!XRE_TermEmbedding)
      return 5;

   nsCOMPtr<nsILocalFile> xuldir;
   rv = NS_NewNativeLocalFile(nsCString(xpcomDll), PR_FALSE,
      getter_AddRefs(xuldir));
   if (NS_FAILED(rv))
      return 6;

   WCHAR* self = new WCHAR[_MAX_PATH];
   GetModuleFileName(m_hInstanceApp, self, _MAX_PATH);

   nsCOMPtr<nsILocalFile> appdir;
   char* selfch;
   CCommonString::ToMBString(self, selfch);
    
rv = NS_NewNativeLocalFile(nsCString(selfch), PR_FALSE,
      getter_AddRefs(appdir));

   if (NS_FAILED(rv))
      return 8;

   rv = XRE_InitEmbedding(xuldir, appdir, nsnull, nsnull, 0);
   if (NS_FAILED(rv))
      return 9;
    
if (NS_FAILED(StartupProfile()))
      return 10;
   delete xulPath;
   delete selfch;
   delete self;
    

   nsCOMPtr<nsIWebBrowser>
      gecko(do_CreateInstance(NS_WEBBROWSER_CONTRACTID));
   nsCOMPtr<nsIBaseWindow>
      baseWindow(do_QueryInterface(gecko, &rv));
   NS_ENSURE_SUCCESS(rv, rv);
   RECT rcLocation;
   ::GetClientRect(pFrm->m_hWnd, &rcLocation);

   if (::IsRectEmpty(&rcLocation)) {
      rcLocation.bottom++;
      rcLocation.top++;
   }

   rv = baseWindow->InitWindow(pFrm->m_hWnd, nsnull, 0, 0,
      rcLocation.right - rcLocation.left,
      rcLocation.bottom - rcLocation.top);

   NS_ENSURE_SUCCESS(rv, rv);

   rv = baseWindow->Create();
   NS_ENSURE_SUCCESS(rv, rv);

   rv = baseWindow->SetVisibility(PR_TRUE);
   NS_ENSURE_SUCCESS(rv, rv);

   nsCOMPtr<nsIWebNavigation>
      webNavigation(do_QueryInterface(gecko, &rv));
   NS_ENSURE_SUCCESS(rv, rv);

   nsCOMPtr<nsISupports> pISupports = NULL;
   rv = webNavigation->LoadURI(NS_LITERAL_STRING("http://www.google.com").get(),
      nsIWebNavigation::LOAD_FLAGS_NONE,
      nsnull, nsnull, nsnull);

   return rv;

}

спустя 13 часов [обр] Валера(0/24)[досье]
Вы бы еще листинг из десятка страниц в машинных кодах выложили и попросили помочь найти ошибку.
спустя 2 дня 14 часов [обр] Владимир Палант(434/4445)[досье]

Думаю, что дело в том, как вы свой nsIWebBrowser инициализируете. К примеру, цитата с http://www.xulplanet.com/references/xpcomref/ifaces/nsIWebBrowser.html:

The chrome object associated with the browser instance. The embedder must create one chrome object for each browser object that is instantiated. The embedder must associate the two by setting this property to point to the chrome object before creating the browser window via the browser's nsIBaseWindow interface.

Возможно, что проблема не только в этом. К сожалению, с примерами не густо, нашел только http://www.symphonyinc.co.jp/mozilla/mazmoz/mazmoz_e/mm_embed4.html.

спустя 15 часов [обр] Lermontov[досье]
Проблема решилась: ошибка в инициализации GRE и XRE.Нужны вызовы функций
rv = NS_InitXPCOM3(nsnull, binDir, nsnull,nsnull,0);
rv = NS_InitEmbedding(binDir, nsnull);
P.S. Спасибо за пример, я его не находил, очень полезная инфа.
Powered by POEM™ Engine Copyright © 2002-2005