很奇怪的有关问题 请大家帮忙检查下代码

很奇怪的问题 请大家帮忙检查下代码
前提:下面这段代码 放在本程序的WM_LBUTTONUP消息内(本程序拦截了全局鼠标WM_LBUTTONUP 消息)
也就是只要有鼠标单击 就执行下面的代码。
问题:通过2种方式创建的鼠标钩子 下面代码执行结果不一样,一个没问题  一个执行出错。
方式1:通过在 DLL内 用SetWindowsHookEx 拦截全局鼠标消息 只要拦截到WM_LBUTTONUP消息 就SenddMessage给本主程序 。这种方式 执行到 hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);  出问题
方式2:同样通过 SetCapture(); 拦截的全局鼠标消息 也是主程序收到 WM_LBUTTONUP 消息 执行下面代码则没问题。
请大家帮忙看下 到底是什么问题。


IHTMLDocument2* GetDocInterface(HWND hWnd) 
{
// 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
IHTMLDocument2* pDoc2=NULL;
if ( hInst != NULL ){
OutputDebugString("OLEACC.DLL ok!");

if ( hWnd != NULL ){
OutputDebugString("GetDocInterface hWnd ok!");
CComPtr<IHTMLDocument2> spDoc=NULL;
LRESULT lRes;

UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
if ( pfObjectFromLresult != NULL ){
OutputDebugString("GetProcAddress pfObjectFromLresult ok!");
HRESULT hr;
//下面这句执行不过去用IID_IHTMLDocument2 程序崩溃 用IID_IHTMLDocument  返回的hr是空
hr=pfObjectFromLresult(lRes,IID_IHTMLDocument2,0,(void**)&spDoc);
hr1=HRESULT_CODE(hr);
if ( SUCCEEDED(hr) ){
OutputDebugString("pfObjectFromLresult ok!");
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
spDoc->get_Script( &spDisp );
spWin = spDisp;
spWin->get_document( &pDoc2 );
}
else if(HRESULT_CODE(hr)==S_FALSE)
{
OutputDebugString("S_FALSE");
}
else if(HRESULT_CODE(hr)==DISP_E_MEMBERNOTFOUND)
{
OutputDebugString("DISP_E_MEMBERNOTFOUND");
}
else if(HRESULT_CODE(hr)==E_NOTIMPL)
{
OutputDebugString("E_NOTIMPL");
}
else if(HRESULT_CODE(hr)==E_INVALIDARG)
{
OutputDebugString("E_INVALIDARG");
}
else if(HRESULT_CODE(hr)==E_OUTOFMEMORY)
{
OutputDebugString("E_OUTOFMEMORY");
}
else if(HRESULT_CODE(hr)==E_FAIL)
{
OutputDebugString("E_FAIL");
}
else if(HRESULT_CODE(hr)==E_ACCESSDENIED)
{
OutputDebugString("E_ACCESSDENIED");

}
else if(HRESULT_CODE(hr)==DISP_E_EXCEPTION)
{
OutputDebugString("DISP_E_EXCEPTION");
}

else
{

OutputDebugString((LPCSTR)HRESULT_CODE(hr)); //没有输出内容(空) 不知道能不能这样转换
}
}
}
::FreeLibrary(hInst);

else{//如果没有安装MSAA
AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
}
return pDoc2;

------解决思路----------------------
出错的时候错误码是多少?崩溃的时候看下调用栈,看下是哪里崩溃的。
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。