描述:
我的接口如下:
[
object,
uuid("12BA9A68-00ED-4ca1-A7D4-BE797DCFE1D3"),
dual, helpstring("IY 接口"),
pointer_default(unique)
]
__interface IY :IDispatch
{
HRESULT GetLong([out]long* data);
};
// Ix1
[
object,
uuid("4A44D89B-E3F0-4239-A7CC-3D7678A76500"),
dual, helpstring("Ix1 接口"),
pointer_default(unique)
]
__interface Ix1 : IY
{
[id(1), helpstring("方法GetFloat")] HRESULT GetFloat([out,retval] FLOAT* data);
[id(2), helpstring("方法GetStruct")] HRESULT GetStruct([out] VARIANT* mystruct);
[id(3), helpstring("方法GetStr1")] HRESULT GetStr1([out]Mystuct* data);
[propget, id(4), helpstring("属性 Point3D")] HRESULT Point3D([in] LONG index, [out, retval] DOUBLE* pVal);
[propput, id(4), helpstring("属性 Point3D")] HRESULT Point3D([in] LONG index, [in] DOUBLE newVal);
};
// _Ix1Events
[
dispinterface,
uuid("B7A0A456-8B27-492D-BFAC-FA87D258FB9D"),
helpstring("_Ix1事件接口")
]
__interface _Ix1Events
{
[id(1), helpstring("方法OnDraw")] HRESULT OnDraw(void);
[id(2), helpstring("方法CreatorAfter")] HRESULT CreatorAfter(void);
};
// Cx1
[
coclass,
threading("apartment"),
support_error_info("Ix1"),
event_source("com"),
vi_progid("MyTest.x1"),
progid("MyTest.x1.1"),
version(1.0),
uuid("4962F2F2-C6B6-477B-A16B-484B6780CEB6"),
helpstring("x1 Class"),
com_interface_entry("COM_INTERFACE_ENTRY(IY)")
]
class ATL_NO_VTABLE Cx1 :
public Ix1
//public _Ix1Events
{
public:
Cx1()
{
m_Point[0] = 0;
m_Point[1] = 0;
m_Point[2] = 0;
}
__event __interface _Ix1Events;
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
virtual HRESULT __stdcall GetLong(long* data);
STDMETHOD(GetFloat)(FLOAT* data);
// _Ix1Events Methods
public:
//STDMETHOD(CreatorAfter)(void);
STDMETHOD(GetStruct)(VARIANT* mystruct);
STDMETHOD(GetStr1)(Mystuct* data);
Mystuct m_stuct;
DOUBLE m_Point[3];
STDMETHOD(get_Point3D)(LONG index, DOUBLE* pVal);
STDMETHOD(put_Point3D)(LONG index, DOUBLE newVal);
};
// x1.h : Cx2 的声明
#pragma once
#include "resource.h" // 主符号
#include "x3.h"
// Ix2
[
object,
uuid("8B395C2C-BF53-4C60-8844-4492AFE7A9F9"),
dual, helpstring("Ix2 接口"),
pointer_default(unique)
]
__interface Ix2 : IY
{
};
// Cx2
[
coclass,
threading("apartment"),
vi_progid("MyTest.x2"),
progid("MyTest.x2.1"),
version(1.0),
uuid("B3EB2D73-9054-4640-9390-A09B0B4E24A9"),
com_interface_entry("COM_INTERFACE_ENTRY(IY)"),
com_interface_entry("COM_INTERFACE_ENTRY(_Ix1Events)"),
helpstring("x2 Class"),
event_receiver(com,true)
//
]
class ATL_NO_VTABLE Cx2 :
public Ix2,
public _Ix1Events
{
public:
Cx2()
: m_data(0)
{
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
virtual HRESULT __stdcall GetLong(long* data);
// _Ix1Events事件
virtual HRESULT __stdcall CreatorAfter();
virtual HRESULT __stdcall OnDraw();
long m_data;
};
Cx1.CPP中
HRESULT Cx1::GetLong(long* data)
{
//this->OnDraw();
this->CreatorAfter();
//_Ix1Events_CreatorAfter();
*data = 120;
return S_OK;
}
Cx2.cpp中
STDMETHODIMP Cx2::CreatorAfter(void)
{
// TODO: 在此添加实现代码
::MessageBox(NULL,"CreatorAfter","test",MB_OK);
m_data = 111;
return S_OK;
}
我在客户端调用GetLong的时候应该出现CreatorAfter对话框,为什么没有出现呢?这是一段vc7下写的atl的源码,希望大虾们帮忙呀!
目的实现当Ix1接口激发事件时Ix2能接收到并进行相应的处理!

