原帖地址:http://www.followman.com/bbs/Topic-B11-T262.aspx
JavaScript动态响应ATL事件
相关讨论:http://topic.csdn.net/t/20061012/21/5078729.html
重 点:脚本传过来的对象是IDispatch接口,应该用IDispatch::Invoke来调用。如果传过来的是个function,那么DISPID 为0,如果是个对象,那么要先用GetIDsOfNames得到DISPID,再Invoke。
相关讨论2:http://topic.csdn.net/u/20080418/12/3c09eb2c-fbb4-419f-8a6e-50d78ba8ff2d.html
控件要实现事件来调用JS脚本,应该使用属性,因为JS语言本身并不支持连接点。假设你的控件是ICtrl,要添加一个FirstEvent事件, 像下面这样做:
IDL:
[propput]HRESULT FirstEvent(VARIANT* pEvent);
.h:
class CCtrl : public ICtrl
{
__stdcall HRESULT put_FirstEvent(VARIANT* pEvent);
CComQIPtr <IDispatch> m_spEvent;
void Fire_FirstEvent(VARIANT sType, VARIANT Msg);
}
.cpp:
HRESULT __stdcall CCtrl::put_FirstEvent(VARIANT* pEvent)
{
assert(pEvent->vt == VT_DISPATCH);
m_spEvent = V_DISPATCH(pEvent);
return S_OK;
}
void CCtrl::Fire_FirstEvent(VARIANT sType, VARIANT Msg)
{
if (m_spEvent)
{
CComVariant args[2] = {sType, Msg};
DISPPARAMS dp = {args, NULL, 2, 0};
m_spEvent->Invoke(0, IID_NULL, LOCALE_USE_DEFAULT, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
}
}
成功实例:
IDL部分:
[propget, id(2), helpstring("属性 OnShowText")] HRESULT OnShowText([out, retval] IDispatchEx** pVal);
[propput, id(2), helpstring("属性 OnShowText")] HRESULT OnShowText([in] IDispatchEx* newVal);
JS部分:
function
CreateATL()
{
this .vv = " ok " ;
m = new ActiveXObject( " ATLPro.AControl " );
m.OnShowText = function () // OnShowText 在ATL中是一个 IDispatchEx 对象
{
a lert( this .vv);
}
}
.cpp部分:
STDMETHODIMP CAControl::ShowText(BSTR v)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HRESULT hr;
VARIANT var;
DISPPARAMS dispparams = {NULL, NULL, 0 , 0 } ;
DISPID dispid = 0 ;
hr = this -> m_OnShowText -> InvokeEx(dispid, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, & dispparams,
& var, NULL, NULL);
if (FAILED(hr))
{}
return S_OK;
}
向JavaScript函数传递参数:
DISPPARAMS dispparams;
memset(
&
dispparams,
0
,
sizeof
dispparams);
dispparams.cArgs
=
2
;
dispparams.rgvarg
=
new
VARIANT[dispparams.cArgs];
for
(
int
i
=
0
; i
<
2
; i
++
)
{
CComBSTR bstr = " 111 " ; // back reading
bstr.CopyTo( & dispparams.rgvarg[i].bstrVal);
dispparams.rgvarg[i].vt = VT_BSTR;
}
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,
0
,DISPATCH_METHOD,
&
dispparams,
&
vaResult,
&
excepInfo,
&
nArgErr);
使用IDispatchEx接口:
在自定义类中添加头文件
#include "dispex.h"
在idl文件中 包含IDL文件
import "dispex.idl";
相关参考:
http://msdn.microsoft.com/en-us/library/sky96ah7(VS.85).aspx
ActiveX 线程技术:http://www.cnblogs.com/phinecos/archive/2008/12/29/1364791.html
查看http://www.followman.com/phone 可以查看详细的借口说明。完全免费使用,欢迎大 家使用。
更多接口本站即将推出。
本文介绍如何通过JavaScript动态响应ATL事件,包括使用IDispatch接口调用JS脚本,向JS函数传递参数的方法,以及成功实例演示。同时提供控件实现事件调用JS脚本的具体步骤。
1706

被折叠的 条评论
为什么被折叠?



