急 OCX访问网页后,IE 报异常
我把网上访问网页的代码封装了下 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();//这里报异常了。
}
问题点数:100、回复次数:4Top
1 楼signoft(晴天)回复于 2005-04-04 15:14:49 得分 10
~CComPtr()
{
if (p)
p->Release();//这里报异常了。
}
如果确定在这里发现异常,应该是你提前把p释放掉了
楼主调试一下看看Top
2 楼asdmusic8(asdmusic8)回复于 2005-04-04 15:35:58 得分 0
我知道问题在什么地方了 我本地的时候是没有框架的 而远程的是有框架的。遇到的问题和
http://dev.csdn.net/develop/article/64/64164.shtm 一样。在框架下get_Script 失败了,之不过怎么这个智能指针释放的时候有问题了。
在64164.shtm 回答 是hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));
这不明摆是要访问顶层框架么?
m_pClientSite的container就是HTMLDocument对象,Get一下Container就可以了
而我代码中没有STopLevelBrowser ,而是直接 做IWebBrowserApp 那按他所说 m_pClientSite的container就是HTMLDocument对象,Get一下Container 该怎么写呢Top
3 楼fool_leave(请及时结贴)回复于 2005-04-04 15:42:38 得分 0
你怎么会在两个地方调用m_pDocument->get_Script
在GetIWebBrowser调用过了,然后又RunScript调用.Top
4 楼fool_leave(请及时结贴)回复于 2005-04-04 16:10:43 得分 90
hr = m_pClientSite->GetContainer(&pOleContainer);
hr = pOleContainer->QueryInterface(IID_IHTMLDocument2,reinterpret_cast<void **>(&pHTMLDocument));
Top




