Здравствуйте, 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. Ну, тут я могу ошибаться, конечно.