学习Com[一]
先从最简单的地方入手,废话省去,直接开始:
1、我用的是vc2005, 新建一个win32工程, 新建一个clsid.h的文件:
#include <Unknwn.h>
// {B73A1FEA-0FCF-4b67-87F9-19EC95B1901A}
static const GUID WG_TEST_CLSID =
{ 0xb73a1fea, 0xfcf, 0x4b67, { 0x87, 0xf9, 0x19, 0xec, 0x95, 0xb1, 0x90, 0x1a } };声名一个GUID来做为要完成的com的标志。
2、新建一个interface.h文件来定义接口:
#include <Unknwn.h>
interface ITestAdd : public IUnknown
{
public:
virtual int AddOpt(int a, int b) = 0;
};
这个接口是用来完成一个加法的功能。
3、开始实现一个类继承于这个接口:
#include "clsid.h"
#include "interface.h"class CAdd : public ITestAdd
{
private:
ULONG m_cRef;public:
STDMETHOD(QueryInterface)(REFIID riid, void **ppv);
STDMETHOD_(ULONG, AddRef) ();
STDMETHOD_(ULONG, Release) ();int AddOpt(int a, int b);
CAdd(void);
};
并完成功能:
#include "stdafx.h"
#include "add.h"
CAdd::CAdd(void)
{
this->m_cRef = 0;
}
int CAdd::AddOpt( int a, int b )
{
return a + b;
}STDMETHODIMP_(ULONG) CAdd::AddRef ()
{
return ++this->m_cRef;
}STDMETHODIMP_(ULONG) CAdd::Release ()
{
ULONG res = --this->m_cRef;
if (res == 0)
{
delete this;
}return res;
}
STDMETHODIMP CAdd::QueryInterface( REFIID riid, void **ppv)
{
if ( riid == WG_TEST_CLSID )
{
*ppv = static_cast<IUnknown*>(this);
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}reinterpret_cast <IUnknown*> (*ppv)-> AddRef();
return S_OK;
}好了,一个最最简单的com出生了,开始运行一下:
#include "stdafx.h"
#include "add.h"int _tmain(int argc, _TCHAR* argv[])
{
ITestAdd * pTestAdd = NULL;
CAdd * pAdd = new CAdd();
pAdd->QueryInterface(WG_TEST_CLSID, (void **)&pTestAdd);if (pTestAdd)
{
int c = pTestAdd->AddOpt(1, 2);
printf("%d", c);}
pTestAdd->Release();
return 0;
}
以上。
作者:GangWang
出处:http://www.cnblogs.com/GnagWang/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。