您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:206 来源:vckbase.com

本文章共3812字,分3页,当前第2页,快速翻页:
 
STDMETHODIMP CSink::QueryInterface(const struct _GUID &iid,void ** ppv)

{

	*ppv=this;

	return S_OK;

}



ULONG __stdcall CSink::AddRef(void)

{	return 1;	}	// 做个假的就可以,因为反正这个对象在程序结束前是不会退出的



ULONG __stdcall CSink::Release(void)

{	return 0;	}	// 做个假的就可以,因为反正这个对象在程序结束前是不会退出的



STDMETHODIMP CSink::GetTypeInfoCount(unsigned int *)

{	return E_NOTIMPL;	}	// 不用实现,反正也不用



STDMETHODIMP CSink::GetTypeInfo(unsigned int,unsigned long,struct ITypeInfo ** )

{	return E_NOTIMPL;	}	// 不用实现,反正也不用



STDMETHODIMP CSink::GetIDsOfNames(const IID &,LPOLESTR *,UINT,LCID,DISPID *)

{	return E_NOTIMPL;	}	// 不用实现,反正也不用



STDMETHODIMP CSink::Invoke(

	long dispID,

	const struct _GUID &,

	unsigned long,

	unsigned short,

	struct tagDISPPARAMS * pParams,

	struct tagVARIANT *,

	struct tagEXCEPINFO *,

	unsigned int *)

{		// 只需要实现这个就足够啦

	switch(dispID)	// 根据不同的dispID,完成不同的回调函数

	{

	case 1:

		......	// 这里就能接收到 COM 发出的事件啦

		break;

	case 2:

		......	// 事件的代号 dispID 其实就是 IDL 文件中的连接点函数的id(n)的号码

		break;

	default:	break;

	}

	return S_OK;

}
、示例(二)
逆风者

  示例程序中的第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; // 这才是正确的操作
 
本文章更多内容<<上一页 - 1 - 2 - 3 - 下一页>>
相关文章

如何实现Office式样的扁平组合框
在EVC3.0中使用数据库
真正的全动态报表:RDLC ReportViewer
DataGrid的客户端分页
用 C 创建简单的 Win32 服务程序
浅谈PDFlib中文输出(二)如何在PDFlib中使
Brew 后台应用开发
VC中调用EXECL模板生成报表
在Visual C 中定制AppWizard (一)
连接 COM 与 .NET 的桥梁(一)——预备知识
层叠式窗体控件指南
基于 SSL 的 ASP.NET Web 应用测试自动化

相关评论


本文章所属分类:首页 VC++

  热门关键字: