描述:
我OCX中起线程,采集数据,当往页面上更新4次后,页面上的按钮,我按的话,就没有反应了。但线程还可继续更新页面。但怎么页面就没有反应了。于是我在IE地址栏中输入其它地址,打开的网页页面上的数据也变的不正确(缺这缺那的)。
CPP
// OcxJavaScript.cpp: implementation of the COcxJavaScript class.
//
//////////////////////////////////////////////////////////////////////
#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= NULL;
IOleContainer* pContainer = NULL;
if (m_handle==NULL) return FALSE;
pClientSite=m_handle->GetClientSite();
if(pClientSite==NULL)return FALSE;
pClientSite->GetContainer(&pContainer);
if (pContainer == NULL ) return FALSE;
pContainer->QueryInterface(IID_IHTMLDocument2,reinterpret_cast<void **>(&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, ...)
{
CComBSTR bstrMember(szFunctionName);
DISPID dispid;
HRESULT hr ;
if (m_pScript!=NULL)
{
hr = m_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 = m_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, ...);
};
调用例子
CString sTime,sYear,sMonth,sDay,sHour,sMinu,sSecond;
SYSTEMTIME CurTime;
GetLocalTime(&CurTime);
sYear.Format("%d",CurTime.wYear);
sMonth.Format("%d",CurTime.wMonth);
if (sMonth.GetLength()==1) sM />
sDay.Format("%d",CurTime.wDay);
if (sDay.GetLength()==1) sDay="0"+sDay;
sHour.Format("%d",CurTime.wHour);
sMinu.Format("%d",CurTime.wMinute);
sSecond.Format("%d",CurTime.wSecond);
sTime = sYear+ "-" + sMonth + "-" + sDay+ " " +sHour + ":" + sMinu + ":" +sSecond;
COcxJavaScript ocxj(this);
if(ocxj.GetIWebBrowser())
{
ocxj.RunScript("showtime",1,sTime);
}
return TRUE;