用纯粹的C++编写COM组件

本文提供一个完全用C++实现的进程内(DLL)COM服务器,不要ATL或MFC提供任何支持。用这种方式编写COM对象可以让你深入地洞察到COM处理进程内服务器的方法以及COM是如何创建类工厂的。利用本文提供的这个简单框架你可以实现很基本的COM组件,如外壳扩展(Shell Extensions)等。如果你在使用过程中发现了任何问题,请将它反馈到vckbase@public.hk.hi.cn。

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

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

1、包含文件comdef.h:#include 。

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
{
public:
  CmyInterface();
  virtual ~CmyInterface();
  // 我们必须要为QueryInterface 编写代码
  STDMETHOD(QueryInterface)(REFIID riid,LPVOID *ppv);
  // ImyInterface 接口方法
  STDMETHOD(Square)(long *pVal);
  STDMETHOD(Cube)(long *pVal);
};

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

时间: 2024-09-17 04:14:44

用纯粹的C++编写COM组件的相关文章

编写 React 组件的最佳实践

本文讲的是编写 React 组件的最佳实践, 当我一开始写 React 的时候,我记得有许多不同的方法来写组件,每个教程都大不相同.虽然从那以后 React 框架已经变得相当的成熟,但似乎仍然没有一种明确的写组件的"正确"方式. 过去一年在 MuseFind 工作中,我们的团队写过了无数的 React 组件.我们也在不断的改善方法直到我们满意为止. 这篇指南是我们建议的编写 React 组件的最佳方式.不管你是初学者还是有经验的人,我们希望它对你有用. 在开始之前,一些注意事项: 我们

用Java编写ASP组件

用Java编写ASP组件    来源 : http://www.edulife.com.cn/Infos/189912/30189912006858.html          ASP通过ActiveX Server Components(ActiveX 服务器元件 ) 使其具有无限可扩充性.在ASP开发当中,免不了使用组件,网上的确有很多的免费,试用的组件,但这是人家的东西,用起来总不免有些担心,自己写的组件用起来才踏实.ActiveX Server Component 可以使用 Visual

在C#代码中调用C++和VB编写的组件

如果不能和用别的编程语言编写的组件进行交互,这种编程技术的含金量就会大打折扣..NET环境为我们提供了不同编程语言编写的组件之间相互调用的良好机制.只要按照.NET可操控代码的标准来编写组件,对于客户程序来说,调用者的组件是哪种语言编写的都无关紧要,调用的方式实际上没有什么区别. 下面我们先后使用C++.VB和C#编写了自己的组件.这是一个简化的字典组件,字典在构造时没有装载语言库,需要使用LoadLibrary来完成.使用FreeLibrary方法把语言库卸载.属性CurrentLibrary

在VC++ 编写的组件中使用ASP对象

简介本文用一个简单的sample演示如何在VC++ ATL编写的组件中调用我们熟悉的ASP对象(Request,Response,Session等等).你会发现在 Visual C++中使用 ATL Object Wizard就可以达到我们的目的.但使用OnStartPage,OnEndPage事件并不是最佳方法.在IIS3.0中,组件能通过IscriptingContext 接口存取ASP内建对象,但这是通过页面级方法来存取内建对象.现在有了一种更好的实现方法,就是利用ObjectContex

使用C#轻松编写.Net组件

在.net框架提出之前,编写组件被视为是一种需要高深技巧的工作,令很多人望而生畏.而.net的出现,使得组件的编写变得如此平易近人,而.net framework的核心语言C#,更是被称为面向组件的语言.在这里,我将向大家介绍如何使用C#编写在.net framework环境下运行的组件,包括如何编写组件类,如何添加域.属性以及事件,如何编译和分发组件.                        首先看下面这段足够简单的代码实例(在后面我们将慢慢将它变成一个五脏俱全的组件):     

使用ejbframe轻松编写EJB组件

EJB(Enterprise Java Bean)是J2EE中最核心的技术,定义了企业级应用组件规范.通过将业务逻辑封装于EJB组件内,实现了3层结构的应用系统的开发. 然而,EJB规范相对比较复杂,编写EJB需要编写EJB的Home接口,Remote接口和EJB实现类.EJB规范对这些接口和类进行了许多约定,手工编写十分不方便且容易出错.这里,我向大家推荐一个工具,ejbframe.ejbframe是minij2ee提供的一个生成EJB组件框架源程序的工具,通过GUI界面操作就能自动生成正确的

编写React组件的最佳实践

在我第一次编写 React 代码的时候,我见发现许多不同的方法可以用来编写组件,不同教程教授的内容也大不相同.尽管从那时候起框架已经相当成熟,但并没有一种固定的"正确"方式指导. 在 MuseFind 工作的一年里,我们的团队编写了许多 React 组件,后期我们对方法进行了优化直到满意为止. 本指南描述了我们推荐的最佳实践,不管你是一名初学者还是有经验的老手,希望它能对你有所帮助. 在我们开始之前,有几个地方要注意一下: 我们使用的是 ES6 和 ES7 的语法. 如果你对于现实和容

求大神指点vb.net怎么编写com组件的dll

问题描述 求大神指点我用vb.net编写的类库生成的dll却不是com组件是什么情况呀...大神们指点指点下呀.... 解决方案 解决方案二:参考:Walkthrough:CreatingCOMObjectswithVisualBasic解决方案三:呜呜,这参考资料看不懂呀,,,有没有实用点的呀,,,解决方案四:程序集信息>使程序集com可见

编写react组件最佳实践

我最开始学习react的时候,看到过各种各样编写组件的方式,不同教程中提出的方法往往有很大不同.当时虽说react这个框架已经十分成熟,但是似乎还没有一种公认正确的使用方法.过去几年中,我们团队编写了很多react组件,我们对实现方法进行了不断的优化,直到满意. 本文介绍了我们在实践中的最佳实践方式,希望能对无论是初学者还是有经验的开发者来说都有一定的帮助. 在我们开始之前,有几点需要说明: 我们是用es6和es7语法 如果你不了解展示组件和容器组件的区别,可以先阅读这篇文章 如果你有任何建议.