描述:
我把网上访问网页的代码封装了下 OcxJavaScript
#include "stdafx.h"
#include "SmartOCXCtl.h"
#include "OcxJavaScript.h"
COcxJavaScript::COcxJavaScript(LPVOID handle)
{
m_pIWebBrowser=NULL;
m_pDocument=NULL;
m_pScript=NULL;
m_handle=(CSmartOCXCtrl*)handle;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
}
COcxJavaScript::~COcxJavaScript()
{
CoUninitialize();
}
BOOL COcxJavaScript::GetIWebBrowser()
{
IOleClientSite* pClientSite;
if (m_handle==NULL) return FALSE;
pClientSite=m_handle->GetClientSite();
if(pClientSite==NULL)return FALSE;
CComQIPtr<IServiceProvider> pISP(pClientSite);
if(pISP==NULL) return FALSE;
pISP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2,(void **)&m_pIWebBrowser);
if(m_pIWebBrowser==NULL)
return FALSE;
m_pIWebBrowser->get_Document((IDispatch**)&m_pDocument);
if(m_pDocument==NULL)
return FALSE;
m_pDocument->get_Script(&m_pScript);
if(m_pScript==NULL)
return FALSE;
return TRUE;
}
HRESULT COcxJavaScript::RunScript(LPCSTR szFunctionName, int nParams, ...)
{
CComPtr<IDispatch> pScript;
HRESULT hr = m_pDocument->get_Script(&pScript);
if (SUCCEEDED(hr))
{
CComBSTR bstrMember(szFunctionName);
DISPID dispid;
hr = pScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);
if (SUCCEEDED(hr))
{
DISPPARAMS dispparams = { NULL, NULL, 0, 0 };
dispparams.cArgs = nParams;
va_list args;
va_start(args,nParams);
VARIANT *pArgs = new VARIANT[nParams+1];
ZeroMemory(pArgs, (nParams+1) * sizeof (VARIANT));
for (int i=0; i<nParams; i++)
{
LPCSTR p = va_arg(args,LPCSTR);
CComBSTR bstr = p;
bstr.CopyTo(&pArgs[i].bstrVal);
pArgs[i].vt = VT_BSTR;
}
va_end(args);
dispparams.rgvarg = pArgs;
DISPID dispidPut = DISPID_PROPERTYPUT;
dispparams.rgdispidNamedArgs = &dispidPut;
dispparams.cNamedArgs = 0;
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
CComVariant vaResult;
UINT nArgErr = (UINT)-1; // initialize to invalid arg
hr = pScript->Invoke (dispid,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);
if (nParams > 0)
delete [] pArgs;
}
}
return hr;
}
头文件
#include "Atlbase.h"
#include "Mshtml.h"
#include <oleacc.h>
class CSmartOCXCtrl;
class COcxJavaScript
{
public:
COcxJavaScript(LPVOID handle);
virtual ~COcxJavaScript();
private:
CComPtr<IWebBrowser2> m_pIWebBrowser;
CComPtr<IHTMLDocument2> m_pDocument;
CComPtr<IDispatch> m_pScript;
CSmartOCXCtrl *m_handle;
IWebBrowser2 *browser;
public:
BOOL GetIWebBrowser();
HRESULT RunScript(LPCSTR szFunctionName, int nParams, ...);
};
然后在调用的地方。我是线程发消息调用OnFireShowMessEventForThread。
//提示信息
LRESULT CSmartOCXCtrl::OnFireShowMessEventForThread(WPARAM wParam, LPARAM lParam)
{
LPCTSTR lp=(LPCTSTR)wParam;
COcxJavaScript ocxj(this);
if(ocxj.GetIWebBrowser())
{
ocxj.RunScript("showmess",1,lp);
}
return TRUE;
}
但是如果网页放在本机运行,没有异常,能正常工作。但如果网页放在其它电脑上。我打开的话,就报异常了。经过调试发现m_pDocument->get_Script(&m_pScript); 该函数没有得到m_pScript。
继续跟踪发现
~CComPtr()
{
if (p)
p->Release();//这里报异常了。
}
解决方案1:
hr = m_pClientSite->GetContainer(&pOleContainer);
hr = pOleContainer->QueryInterface(IID_IHTMLDocument2,reinterpret_cast<void **>(&pHTMLDocument));
~CComPtr()
{
if (p)
p->Release();//这里报异常了。
}
如果确定在这里发现异常,应该是你提前把p释放掉了
楼主调试一下看看