IHTMLDocument2* HWnd2HtmlDocument( HWND hWnd )
{        //hWnd is "Internet Explorer_Sever"
if( ! ::IsWindow(hWnd))
return NULL;

CoInitialize(0);
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
if ( hInst == NULL ) return FALSE;
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg,
0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult =
(LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst,
"ObjectFromLresult");
if ( pfObjectFromLresult == NULL )
{
::FreeLibrary( hInst );
CoUninitialize();
return FALSE;
}
WCHAR strDoc[] = L"{626fc520-a41e-11cf-a731-00a0c9082637}";
//IID_IHTMLDocument2 CLSID
CLSID uuidDoc;
HRESULT hrDoc = CLSIDFromString((LPOLESTR)strDoc,
&uuidDoc //IID_IHTMLDocument2
);
if(!SUCCEEDED(hrDoc))
{
::FreeLibrary( hInst );
CoUninitialize();
return FALSE;
}

IHTMLDocument2* pDoc;
HRESULT hr  = (*pfObjectFromLresult)( lRes, uuidDoc,
//IID_IHTMLDocument,
0, (void**)&pDoc);
if ( SUCCEEDED(hr) )
{
//OK, We Get Here Successfully
BSTR title;
pDoc->get_title(&title);///access violation?
return pDoc;
}
else
{
::FreeLibrary( hInst );
CoUninitialize();
return FALSE;
}
::FreeLibrary( hInst );
CoUninitialize();
return NULL;
}

解决方案 »

  1.   

    原理:
    如果你的系统安装了Microsoft 活动辅助功能(MSAA),则您可以向浏览器窗口
    (类名"Internet Explorer_Server")发送WM_HTML_GETOBJECT消息,将消息返回的结果
    作为一个参数传递给MSAA函数ObjectFromLresult,从而获取IHTMLDocument2 接口。
    还有就是,不要随便用其它的GUID,用系统的IID_IHTMLDocument安全点
      

  2.   

    自己解决了,不知道怎么回事。
    IHTMLDocument2* pDoc;
        HRESULT hr  = (*pfObjectFromLresult)( lRes, uuidDoc,
            //IID_IHTMLDocument,
            0, (void**)&pDoc);
    得到的pDoc出现access violation
    改成ObjectFromLresult(同样的参数)得到的pDoc就可以随便用了,不出错。