软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|开发客
您现在的位置: 天极网 > 开发频道 > COM接口在不同线程中的传递技巧两则
全文

COM接口在不同线程中的传递技巧两则

2005-06-02 11:09作者:激烈振动出处:博客园责任编辑:方舟
  在多线程程序中使用COM对象真是件令人头疼的事情。当你能够访问一个接口指针的时候,并不意味着你可以调用接口上的方法。我从来没真正搞懂过所谓COM的几种线程模式。问题是,当我试图在一个线程里调用一个COM接口的方法,而这个COM接口是在另一个线程中创建时,从来没有成功过。更糟的是,连错误提示都没有。

  全局接口表实现COM接口在不同线程中的传递

  在多个线程中传递接口需要额外的工作,各种书籍上都介绍了所谓Marshal一个接口方法,不过我从来没有使用过。因为有更简单的方法,就是用全局接口表(GlobalInterfaceTable)。

  GlobalInterfaceTable允许你在任何地方访问任何线程中创建的COM接口。GlobalInterfaceTable本身是一个COM对象,它实现了IGlobalInterfaceTable接口。这个接口有三个方法,分别用来注册接口,取得接口和注销接口。下面的例子介绍了GlobalInterfaceTable的基本使用方法。

  首先当创建一个需要在其他线程使用的COM接口时,把它注册到GlobalInterfaceTable。

CComPtr<IMyInterface> spMyInterface;
spMyInterface.CoCreateInstance();
//register interface in global interface table
CComPtr<IGlobalInterfaceTable> spGIT;
spGIT.CoCreateInstance(CLSID_StdGlobalInterfaceTable);
if (spGIT)
{
 spGIT->RegisterInterfaceInGlobal(spMyInterface, IID_IMyInterface, &m_dwCookie);
}

  注册时会返回一个Cookie,记住这个Cookie,并在任何线程需要使用前面接口时,通过这个Cookie获得接口。

CComPtr<IMyInterface> spMyInterface;

if (m_dwCookie!=0)
{
 CComPtr<IGlobalInterfaceTable> spGIT;
 spGIT.CoCreateInstance(CLSID_StdGlobalInterfaceTable);
 if (spGIT)
 {
  spGIT->GetInterfaceFromGlobal(m_dwCookie, IID_IMyInterface, (void**)&spMyInterface.p);
 }
}

if (spMyInterface)
{
 //Call my interface
}

  最后,作为一个负责任的程序员,关闭之前一定要注销前面注册的接口。

if (m_dwCookie!=0)
{
 CComPtr<IGlobalInterfaceTable> spGIT;
 spGIT.CoCreateInstance(CLSID_StdGlobalInterfaceTable);
 if (spGIT)
 {
  spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
  m_dwCookie = 0;
 }
}

  需要注意的时,我们每次都是新创建GlobalInterfaceTable的实例,因为它本身也是COM对象,它的指针不能在不同线程间传递。

软件资讯·软件下载尽在天极软件

共2页。 1 2 下一页 末页
相关搜索:
相关文章及软件
关注此文读者还看过
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众