1、 创建一个win32 dll应用类型项目工程。
2、 添加ComTest.h及ComTest.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;
}