使用纯粹的C 语言编写COM组件

2008-02-23 05:24:52来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

本文提供一个完全用C 实现的进程内(DLL)COM服务器,不要ATL或MFC提供任何支持。用这种方式编写COM对象能够让您深入地洞察到COM处理进程内服务器的方法连同COM是如何创建类工厂的。利用本文提供的这个简单框架您能够实现很基本的COM组件,如外壳扩展(Shell Extensions)等。

  以下是用本文所说的方式编写自己的COM对象要经过的步骤:

  第一步:写一个头文档,这个头文档包含以下内容:

  1、 包含文档comdef.h:#include <comdef.h>。

  2、 定义COM服务器的GUID。

_declspec(selectany) GUID CLSID_Mine = { 0xdc186800,
0x657f,
0x11d4,
{0xb0, 0xb5, 0x0, 0x50, 0xba, 0xbf, 0xc9, 0x4}
};

  3、 给出接口的IID连同这个接口要实现的方法定义。到时客户端会用到这个接口的IID和接口的方法。

interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904")) ImyInterface : public IUnknown
{
STDMETHOD(Square)(long *pVal)PURE;
STDMETHOD(Cube)(long *pVal)PURE;
};

  客户端使用此接口:

HRESULT hr;
ImyInterface *pmine=(0);
hr = CoCreateInstance(CLSID_Mine, // COM 服务器的CLSID
NULL, //不支持聚合
CLSCTX_INPROC_SERVER, // 是个DLL
__uuidof(ImyInterface), // 接口的IID
(void**)&pmine
);

  更有一种方法能够从注册表中获得COM对象的CLSID,就是调用CLSIDFromProgId()函数,但是必须把组件的ProgId传递给这个函数。

  第二步:必须为所定义的接口提供实现,本文用的方法是创建一个从接口继承的新类:

// 这个类实现单接口ImyInterface ...
//
//
class CmyInterface : public CComBase<> ,
public InterfaceImpl<ImyInterface>
{
public:
CmyInterface();
virtual ~CmyInterface();

// 我们必须要为QueryInterface 编写代码
STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv);

// ImyInterface 接口方法
STDMETHOD(Square)(long *pVal);
STDMETHOD(Cube)(long *pVal);

};


  模版类InterfaceImpl<>提供接口引用计数的实现。在此我们能够用多接口继承,那样就能在一个COM组件中实现多个接口。



[1] [2] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: Linux上搭建C/C IDE研发环境

下一篇: BitTorrent 协议规范(翻译)

热门词条
热门标签