21xrx.com
2024-11-05 14:48:08 Tuesday
登录
文章检索 我的文章 写文章
C++编写COM组件 - 从入门到实战
2023-07-12 12:53:39 深夜i     --     --
C++ COM组件 入门 实战 编写

在计算机编程中,COM组件是用于实现不同应用程序间通信所必需的一种技术。C++是一种强大的编程语言,它被广泛应用于开发Windows平台上的COM组件。本文将介绍如何使用C++编写COM组件,从入门到实战。

一、熟悉COM

COM(组件对象模型,Component Object Model) 是 Windows 下的一种对象模型,由微软公司提出并推广,用于实现组件化的软件开发,它主要解决 COM 组件之间的交互、基于 COM 组件的应用程序(通常是客户端)与 COM 服务器之间的交互以及 COM 组件的注册与卸载等问题。

二、创建COM组件

1、创建新的C++项目

2、添加头文件

需要添加如下的头文件:

#include

#include "atlbase.h"

#include "stdafx.h"

其中,windows.h 是Windows操作系统的核心头文件,atlbase.h 是ATL库的头文件,stdafx.h 是Visual C++使用的预编译头文件,用于提高编译速度。

3、编写COM组件的基本结构

在头文件中添加以下代码:

class ATL_NO_VTABLE CMyComObj :

  public CComObjectRootEx ,

  public CComCoClass ,

  public IDispatchImpl

{

public:

  CMyComObj()

DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMOBJ)

BEGIN_COM_MAP(CMyComObj)

  COM_INTERFACE_ENTRY(IMyComObj)

  COM_INTERFACE_ENTRY(IDispatch)

END_COM_MAP()

public:

  STDMETHOD(Method1)(BSTR bstrIn, BSTR* pbstrOut);

  STDMETHOD(Method2)(BSTR bstrIn, BSTR* pbstrOut);

};

其中包括了类定义、声明了 MyComObj 的 GUID 和继承了接口 IMyComObj,以及异步接口 IDispatchImpl。

• DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMOBJ),用于在程序运行时为 MyComObj 自动注册表。

• BEGIN_COM_MAP(CMyComObj) 将 IMyComObj 和 IDispatch 接口与 C++ 对象关联起来。

4、实现COM组件

可以分为两个主要部分:

① CLASSFACTORY

② MyComObj

其中,CLASSFACTORY 是用于创建 MyComObj 对象的类。

#ifndef __cplusplus

#error ATL requires C++ compilation (use a .cpp suffix)

#endif

#include "resource.h"

#include

class ATL_NO_VTABLE CMyComObjClassFactory :

  public CComObjectRootEx ,

  public CComCoClass ,

  public IClassFactory

{

public:

  CMyComObjClassFactory()

DECLARE_REGISTRY_RESOURCEID(IDR_MYCOMOBJFACTORY)

BEGIN_COM_MAP(CMyComObjClassFactory)

  COM_INTERFACE_ENTRY(IClassFactory)

END_COM_MAP()

// IClassFactory Methods

public:

  STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj)

  {

    if (pUnkOuter != NULL)

      return CLASS_E_NOAGGREGATION;

    CMyComObj* pNewObj;

    HRESULT hr = CMyComObj::CreateInstance(&pNewObj);

    if (FAILED(hr))

      return hr;

    hr = pNewObj->QueryInterface(riid, ppvObj);

    if (FAILED(hr))

      delete pNewObj;

    return hr;

  }

  STDMETHOD(LockServer)(BOOL fLock)

  {

    if (fLock)

      InterlockedIncrement(&g_cLock);

    else

      InterlockedDecrement(&g_cLock);

    return S_OK;

  }

};

其中,包括类定义以及定义了 CLASSFACTORY 的 GUID。

5、编译、注册和测试COM组件

编译后,我们需要在服务端注册该组件,可以使用 regsvr32 命令行工具:

regsvr32 MyComObj.dll

最后,我们还要测试 MyComObj,使用 Excel 打开 Visual Basic 编辑器,导入对象库:MyComObjLib,然后添加如下代码:

Dim MyObj As New MyComObjLib.MyComObj

Set MyObj = CreateObject("MyComObj.MyComObj")

MsgBox MyObj.Method1("Hello", '')

MyObj.Method2("Hello", '')

三、总结

在本文中,我们学习了如何使用C++编写COM组件,了解了COM的概念、结构,以及在Visual Studio中实现COM组件所需的步骤。对于想要自学编写COM组件的读者,这将是一个很好的入门指南。希望你们能够在实践中不断提高自己的编程技能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复