关于ActiveX Script事件响应的问题
hyamw 2006-02-16 02:38:42 参照MSDN上的文章:
http://support.microsoft.com/kb/q223139/
用VC++.NET 2003写的一个程序却不能实现同样的效果 :(
// MyObject.h : CMyObject 的声明
#pragma once
#include "resource.h" // 主符号
// IMyObject
[
object,
uuid("8D0DBF1A-359D-4856-9178-692298594CE8"),
dual, helpstring("IMyObject 接口"),
pointer_default(unique)
]
__interface IMyObject : IDispatch
{
[id(1), helpstring("方法SayHi")] HRESULT SayHi(void);
[id(2), helpstring("方法SayHi2")] HRESULT SayHi2(void);
[id(3), helpstring("方法Fire_MyEvent")] HRESULT Fire_MyEvent(void);
};
// _IMyObjectEvents
[
dispinterface,
uuid("0D826746-D433-48CB-A762-4A400E3E0AC9"),
helpstring("_IMyObject事件接口")
]
__interface _IMyObjectEvents
{
[id(1), helpstring("方法MyEvent")] HRESULT MyEvent(void);
};
// CMyObject
[
coclass,
threading("apartment"),
event_source("com"),
vi_progid("ATLScriptTest.MyObject"),
progid("ATLScriptTest.MyObject.1"),
version(1.0),
uuid("631C2C47-51A7-43BC-AEAC-B1BB1EACF7FF"),
helpstring("MyObject Class")
]
class ATL_NO_VTABLE CMyObject :
public IObjectWithSiteImpl<CMyObject>,
public IMyObject
{
public:
CMyObject()
{
}
__event __interface _IMyObjectEvents;
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD(SayHi)(void);
STDMETHOD(SayHi2)(void);
STDMETHOD(Fire_MyEvent)(void);
};
// MyObject.cpp : CMyObject 的实现
#include "stdafx.h"
#include "MyObject.h"
#include ".\myobject.h"
// CMyObject
STDMETHODIMP CMyObject::SayHi(void)
{
::MessageBox(NULL, "Inside SayHi()", "", MB_SETFOREGROUND);
return S_OK;
}
STDMETHODIMP CMyObject::SayHi2(void)
{
::MessageBox(NULL, "Inside SayHi2()", "", MB_SETFOREGROUND);
return S_OK;
}
// 由于.NET 没有生成Fire_XXX之类的方法,所以我自己添加了一个这样的方法。
STDMETHODIMP CMyObject::Fire_MyEvent(void)
{
__raise MyEvent();
return S_OK;
}
脚本测试代码:
SayHi
Sub MyObject_MyEvent
SayHi2
End Sub
SayHi调用是正常的,但是程序里面触发的MyEvent事件却没有得到脚本程序的响应。求教高手指点指点,这是为什么?