Re[3]: TcppWebBrowser не освобождает память
От: Аноним  
Дата: 26.07.05 16:10
Оценка:
Здравствуйте, yuha, Вы писали:


Y>>Встречался с описанием подобной проблемы на DelphiKingdom.

Y>>Если не ошибаюсь, там предлагали обращаться к свойствам html документа
Y>>не через методы класса TCppWebBrowser, а через COM интерфейс напрямую.

Y>Вот, еще по теме, но для Delphi:



Y> К счастью эту проблему легко обойти, использовав для получения

Y>IHtmlDocument2 альтернативные возможности, хотя бы WebBrowser1.ControlInterface.Document

Через WebBrowser1.ControlInterface.Document не сработало: память не освобождается, но все равно спасибо за идею! В принципе, сделал немного не так, но в том направлении, и все заработало:

  IUnknown* pUnk = NULL;
  IWebBrowser2* pBrowser = NULL;
  IDispatch* pDisp = NULL;
  IHTMLDocument2* pDoc = NULL;

  if (SUCCEEDED(HTMLedit->ControlInterface->QueryInterface(
         IID_IUnknown, (LPVOID*)&pUnk)))
  {
        if (SUCCEEDED(pUnk->QueryInterface(
         IID_IWebBrowser2, (LPVOID*)&pBrowser)))
        {
          pBrowser->get_Document(&pDisp);
          if (pDisp) {
                if (SUCCEEDED(pDisp->QueryInterface(
                 IID_IHTMLDocument2, (LPVOID*)&pDoc)))
                {
                  HRESULT hresult = S_OK;
                  VARIANT *param;
                  SAFEARRAY *sfArray;

                  WideString ws;
                  ws = WideString(*text);

                  // Creates a new one-dimensional array
                  sfArray = SafeArrayCreateVector(VT_VARIANT, 0, 1);

                  if (sfArray == NULL ) {
                      goto cleanup;
                  }

                  hresult = SafeArrayAccessData(sfArray,(LPVOID*) & param);
                  param->vt = VT_BSTR;
                  param->bstrVal = BSTR(ws); //bs;

                  SafeArrayUnaccessData(sfArray);
                  hresult = pDoc->write(sfArray);
                  if (hresult != S_OK ) ShowMessage("Ошибка создания HTML-документа");

     cleanup:
                  param->bstrVal = NULL;

                  if (sfArray != NULL) {
                      SafeArrayDestroy(sfArray);
                  }

                  pDoc->Release();
                } // pDoc

                pDisp->Release();
          } // pDisp

          pBrowser->Release();
        } // pBrowser

        pUnk->Release();
  } // pUnk
  else ShowMessage("Невозможно создать HTML-документ");


после этого в диспетчере задач ясно видно, что память освобождается полностью или почти полностью: после закрытия окна, содержащего TCppWebBrowser, обьем занимаемой моей программой памяти возвращается в прежнее состояние плюс-минус несколько десятков килобайт(ранее он все время увеличивался на несколько мегабайт после закрытия окна). Неточное соответствие занимаемой памяти до и после закрытия окна скорее всего объясняется тонкостями работы менеджера памяти Windows. Ну, тут я могу ошибаться, конечно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.