Re: IMarkupServices ParseString Memory leakage..
On May 14, 10:05 am, Goran <goran.pu...@gmail.com> wrote:
With all due respect, this really is bad, bad, bad...
bool InitializeHTMLDocument()
{
try
{
CoInitialize(NULL);
You must check if this worked.
HRESULT hRes = >CoCreateInstance(CLSID_HTMLDocument,
NULL,
CLSCTX_INPROC_SERVER,
IID_IHTMLDocument2,
(LPVOID *) &pDoc);
if(FAILED(hRes))
return false;
hRes = pDoc->QueryInterface(__uuidof(IMarkupServices)=
,(LPVOID *)
&pMS);
if(FAILED(hRes))
throw hRes;
You can't just throw here, you must call pDoc->Release() or as said,
and better yet, use a smart pointer. You have one AddRef from
CoCreateInstance left behind. Same for other QI calls further.
Also, "throw hRes" there is exactly same as "return false;", but
slower. And both solutions are horrible. You have an error, but you
lost any info on it. That's not good. Same for other throws further.
pPersist = NULL;
hRes = pDoc->QueryInterface(IID_IPersistStreamInit,
(LPVOID *) &pPersist);
if(FAILED(hRes))
throw hRes;
hRes = pPersist->InitNew();
if(FAILED(hRes))
throw hRes;
}
catch(HRESULT hResult)
{
return false;
}
catch (...)
This catch is pointless. You have pure C code there. That can't throw
anything (or at least not anything that you can catch with catch(...)
with a recent MS compiler). Only exception possible is your hRes, and
that's done already.
(catch(...) should be only used as a last resort, preferably only in
_DEBUG builds, or in some kind of "log before panic" scenario).
Please try to improve this function first, then come ask again?
Goran.
Thanks all for your expert comment.
Below is Smart Pointer based code...
--------------------------------------------------
HtmlToText(const CString &sHTMLData, CString &sPlainText)
{
HRESULT hr = S_OK;
try
{
///////////////////////////////////////////////////////////////////
hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
// Create a Document to bootstrap the process
CComPtr< MSHTML::IHTMLDocument2 > pDocument;
CoCreateInstance( CLSID_HTMLDocument, NULL,
CLSCTX_INPROC_SERVER, IID_IHTMLDocument2,
reinterpret_cast<PVOID*>( &pDocument ) );
if( NULL == pDocument.p ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
CComPtr< IPersistStreamInit > pPersistStream;
hr = pDocument->QueryInterface( IID_IPersistStreamInit,
reinterpret_cast<PVOID*>( &pPersistStream ) );
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
// From MSDN
hr = pPersistStream->InitNew();
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
CComPtr< MSHTML::IMarkupServices > pMarkupServices;
hr = pDocument->QueryInterface(__uuidof(IMarkupServices),
reinterpret_cast<PVOID*>( &pMarkupServices ) ) ;
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
CComPtr< MSHTML::IMarkupPointer > pBegin;
hr = pMarkupServices->CreateMarkupPointer( &pBegin );
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
CComPtr< MSHTML::IMarkupPointer > pEnd;
hr = pMarkupServices->CreateMarkupPointer( &pEnd );
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
CComPtr< MSHTML::IMarkupContainer > pContainer;
_bstr_t bsHTMLData(sHTMLData);
hr = pMarkupServices->ParseString(bsHTMLData, 0, &pContainer,
pBegin, pEnd );
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
CComPtr< MSHTML::IHTMLDocument2 > pNewDocument;
pContainer->QueryInterface( IID_IHTMLDocument,
reinterpret_cast<PVOID*>( &pNewDocument ) );
if( FAILED( hr ) ) { throw __LINE__; }
///////////////////////////////////////////////////////////////////
CComPtr< MSHTML::IHTMLElement> pBody;
hr = pNewDocument->get_body( &pBody);
if( FAILED( hr ) ) { throw __LINE__; }
CComBSTR Text;
hr = pBody->get_innerText( &Text );
sPlainText = Text.m_str;
}
catch( _com_error* e )
{
std::wcout << std::endl;
std::wcout << L"COM Error: " << e->ErrorMessage() << std::endl;
std::wcout << std::hex << L" 0x" << std::setw( 8 ) << e->Error();
std::wcout << L" (Win32: " << std::dec << HRESULT_CODE(e->Error
() );
std::wcout << L")" << std::endl;
}
catch( INT line )
{
std::wcout << std::endl;
std::wcout << L"COM Error near Line " << line << std::endl;
std::wcout << std::hex << L" 0x" << std::setw( 8 ) << hr;
std::wcout << L" (Win32: " << std::dec << HRESULT_CODE( hr );
std::wcout << L")" << std::endl;
}
catch( ... )
{
std::wcout << std::endl;
std::wcout << L"COM Error:" << std::endl;
std::wcout << std::hex << L" 0x" << std::setw( 8 );
std::wcout << std::setfill( L'0' ) << hr;
std::wcout << L" (Win32: " << std::dec << HRESULT_CODE( hr );
std::wcout << L")" << std::endl;
}
CoUninitialize( );
return HRESULT_CODE( hr );
}
--------------------------------------------------
MEMORY LEAKEAGE IS STILL THERE......
Any solution for it?