hyamw NoCompany 学生  2006年02月16日
关于ActiveX Script事件响应的问题
参照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事件却没有得到脚本程序的响应。求教高手指点指点,这是为什么?
...全文
78 点赞 收藏 3
写回复
3 条回复

还没有回复,快来抢沙发~

发动态
发帖子
VC.NET
创建于2007-09-28

7261

社区成员

2.7w+

社区内容

.NET技术 VC.NET
社区公告
暂无公告