用c++实现com组件示例

这篇博客详细介绍了如何使用C++实现COM组件,包括创建DLL项目、定义接口和类、实现IUnknown接口、创建对象工厂、注册COM组件到注册表等关键步骤,适合C++开发者学习COM编程。

 

1、 创建一个win32  dll应用类型项目工程。

2、  添加ComTest.hComTest.cpp文件,并在ComTest.h头文件包含Unknwn.h头文件

3、  guid.exe生成一个接口IID及com对象类CLSID

代码如下:

//ComTest.h

#pragma once

 

#include <Unknwn.h>

 

EXTERN_C const CLSID CLSID_TestObject;

EXTERN_C const CLSID IID_ObjectInterface;

 

MIDL_INTERFACE("DE5A091A-EF80-4bd3-8AEB-CB20B879A2F1")

IObjectInterface :public IUnknown

{

   virtual void __stdcall TestMethod() PURE;

};

//ComTest.cpp

#include "StdAfx.h"

#include "ComTest.h"

 

 

EXTERN_C const CLSID CLSID_TestObject  =

{0xa33e547a, 0x8a95, 0x4118, {0x86, 0xa, 0x46, 0xb2, 0x3c, 0x6d, 0x40, 0xbd}};

EXTERN_C const CLSID IID_ObjectInterface  =

{0xde5a091a, 0xef80, 0x4bd3, {0x8a, 0xeb, 0xcb, 0x20, 0xb8, 0x79, 0xa2, 0xf1}};

 

 

 

4、  添加CTestObject类,这个类必须实现IObjectInterface接口,并且必须实现IUnkown接口的三个函数。

代码如下

//TestObject.h

#pragma once

#include "ComTest.h"

 

class CTestObject:public IObjectInterface

{

public:

CTestObject(void);

public:

~CTestObject(void);

 

public:

HRESULT __stdcall QueryInterface( REFIID riid,void **ppvObject);

ULONG   __stdcall AddRef( void);

ULONG   __stdcall Release( void);

public:

void   __stdcall TestMethod();

private:

int m_nRef;

};

 //TestObject.cpp

#include "StdAfx.h"

#include "TestObject.h"

#include <iostream>

using namespace std;

 

CTestObject::CTestObject(void)

:m_nRef(0)

{

}

 

CTestObject::~CTestObject(void)

{

}

 

HRESULT  CTestObject::QueryInterface( REFIID riid,void **ppvObject)

{

  if (riid==__uuidof(IUnknown))

  {

     *ppvObject = (IUnknown*)this;

     ((IUnknown*)*ppvObject)->AddRef();

     return S_OK;

  }

  else if (riid==__uuidof(IObjectInterface))

  {

     *ppvObject = (IObjectInterface*)this;

     ((IObjectInterface*)*ppvObject)->AddRef();

     return S_OK;

  }

  else

  {

     *ppvObject = NULL;

     return E_NOINTERFACE;

  }

}

ULONG    CTestObject::AddRef( void)

{

  m_nRef++;

  return m_nRef;

}

ULONG    CTestObject::Release( void)

{

  m_nRef--;

  if (m_nRef==0)

  {

     delete this;

  }

  return m_nRef;

}

 

void

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值