示例程序中的第2个组件(MultConnect),我们再增加一个连接点( _IDispConnectEvents2 )。这个接口对象负责完成一个时钟,每间隔一定的豪秒就向调用者发出“时钟事件”。增加第二个连接点的方法是要手工修改 IDL 文件
......
library MultConnectLib
{
importlib("stdole2.tlb");
...... // 第一个连接点。是 ATL 帮我们生成的
[ // 第2个连接点,需要我们手工添加
uuid(E3330AE1-2B1D-42E6-A8E0-A9CB0D1AC74C), // CLSID 可以用 GUIDGEN.EXE 产生
helpstring("_IDispConnect事件接口")
]
dispinterface _IDispConnectEvents2
{
properties:
methods:
};
[
uuid(4B0FDB44-BAF2-4F25-A2B0-B5ECD5CD440E), // 这是示例程序的类型库ID,肯定和你产生是不同的
helpstring("DispConnect Class")
]
coclass DispConnect
{
[default] interface IDispConnect;
[default, source] dispinterface _IDispConnectEvents;
[source] dispinterface _IDispConnectEvents2; // 别忘了,这还有一行
};
};好了,和前面的方式一样,增加接口函数、让IDE帮我们实现代理类代码、输入程序代码、修改框架代码中的BUG。在示例中,我们的事件函数叫 HRESULT Timer([in] VARIANT varData),varData 中传递一个时间类型(VT_DATA)的信息(注3)。下面我们来看一下代理类代码中的错误:
HRESULT Fire_Timer( VARIANT varDate)
{
HRESULT hr = S_OK;
T * pThis = static_cast(this);
int cConnections = m_vec.GetSize();
for (int iConnection = 0; iConnection < cConnections; iConnection++)
{
pThis->Lock();
CComPtr punkConnection = m_vec.GetAt(iConnection);
pThis->Unlock();
IDispatch * pConnection = static_cast(punkConnection.p);
if (pConnection)
{
CComVariant avarParams[1];
// 原始为:avarParams[0] = varDate; avarParams[0].vt = VT_VARIANT;
// 但可惜这是错误的,因为 avarParams[0] = varDate; 就已经正确地完成了赋值
// 再对 avarParams[0].vt 赋值,是引用方式才能这么操作的。
avarParams[0] = varDate; // 这才是正确的操作
CComVariant varResult;
DISPPARAMS params = { avarParams, NULL, 1, 0 };
hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &varResult, NULL, NULL);
}
}
return hr;
}在编写调用者客户端代码方面,如果你需要接收时钟事件,那么可以仿照示例一再从 IDispatch 派生一个时钟接收器。大家下载事例程序代码,里面有丰富的注释信息。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- (6287篇文章).NET移动与嵌入式技术
- (5955篇文章).NET开发手册
- (519篇文章).NET应用研究
- (1768篇文章).NET实用开发
- (0次浏览)Ubuntu架设asp.net服务器
- (0次浏览)浅谈ASP.NET开发下的MVC设计模式的实现
- (0次浏览)微软最新ASP.NET MVC框架Beta版技术细节
- (0次浏览)浅谈关于C#、Java泛型的看法



