一个简单的COM程序
来源:互联网 发布:html静态网站源码 编辑:程序博客网 时间:2024/05/12 03:03
//
//IUnkown.cpp
//
//
#include <iostream.h>
#include <objbase.h>
void trace(const char * msg) {cout << msg << endl ;}
//Interface
interface IX : IUnknown
{
virtual void __stdcall Fx() = 0;
};
interface IY : IUnknown
{
virtual void __stdcall Fy() = 0;
};
interface IZ : IUnknown
{
virtual void __stdcall Fz() = 0;
};
//Forward references for GUIDs
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
//
//Component
//
class CA : public IX, public IY
{
//IUnknown implementation
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
virtual ULONG __stdcall AddRef() {return 0;}
virtual ULONG __stdcall Release() {return 0;}
//Interface IX implementation
virtual void __stdcall Fx() {cout << "Fx" << endl ;}
//Interface IY implementation
virtual void __stdcall Fy() {cout << "Fy" << endl ;}
};
HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{
if(iid == IID_IUnknown)
{
trace("QueryInterface:Return pointer to IUnknown.");
*ppv = static_cast< IX* >(this);
}
else if(iid == IID_IX)
{
trace("QueryInterface:Return pointer to IX.");
*ppv = static_cast< IX* >(this);
}
else if(iid == IID_IY)
{
trace("QueryInterface:Return pointer to IY.");
*ppv = static_cast< IY* >(this);
}
else
{
trace("QueryInterface:Interface not supported.");
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast< IUnknown* >(*ppv)->AddRef();
return S_OK;
}
//
//Creation function
//
IUnknown* CreateInstance()
{
IUnknown* pI = static_cast< IX* >(new CA);
pI->AddRef();
return pI;
}
//
//IIDs
//
//{32bb8320-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IX =
{0x32bb8320, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};
//{32bb8321-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IY =
{0x32bb8321, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};
//{32bb8322-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IZ =
{0x32bb8322, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};
//
//Client
//
int main()
{
HRESULT hr;
trace("Client:Get an IUnknown pointer.");
IUnknown* pIUnknown = CreateInstance();
trace("Client:Get Interface IUnknown.");
IUnknown* pIUnknown1 = NULL;
hr = pIUnknown->QueryInterface(IID_IUnknown,(void**)&pIUnknown1);
trace("Client:Get Interface IX.");
IX* pIX = NULL;
hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IX.");
pIX->Fx(); //Use interface IX
}
trace("Client:Get Interface IY.");
IY* pIY = NULL;
hr = pIUnknown->QueryInterface(IID_IY,(void**)&pIY);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IY.");
pIY->Fy(); //Use interface IY
}
trace("Client:Get Interface IZ.");
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface(IID_IZ,(void**)&pIZ);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IZ.");
pIZ->Fz();
}
else
{
trace("Client:Could not get interface IZ.");
}
trace("Client:Get interface IY from interface IX.");
IY* pIYfromIX = NULL;
hr = pIX->QueryInterface(IID_IY, (void**)&pIYfromIX);
if(SUCCEEDED(hr))
{
trace("Client:Succeeded getting IY.");
pIYfromIX->Fy();
}
trace("Client:Get interface IUnknown from IY.");
IUnknown* pIUknownFromIY = NULL;
hr = pIY->QueryInterface(IID_IUnknown, (void**)&pIUknownFromIY);
if(SUCCEEDED(hr))
{
cout << "equal?" ;
if(pIUknownFromIY == pIUnknown)
{
cout << "Yes." << endl;
}
else
{
cout << "No." << endl;
}
}
//Delete the component
delete pIUnknown;
return 0;
}
- 一个简单的COM程序
- COM一个简单的例子
- 一个比较简单的COM
- 简单的一个程序
- 一个简单的程序
- 一个简单的程序
- 一个简单的com组件的实现
- 编写一个简单的COM组件
- 实现一个最最简单的COM组件
- 2.实现一个最简单的COM
- 一个模拟的COM示例程序
- 一个可运行的COM程序
- COM初学(二) 编写和使用一个简单的COM
- 一个COM示例程序
- 一个简单的解密程序
- 一个简单的XWindow程序
- 一个简单的端口扫描程序
- 一个简单的OpenGL程序
- JS的拒绝访问的错误
- DOS/Windows和Linux/Unix间文件格式转换--include.h:????????的解决方法
- 个人关于SQLHelper的应用
- JS调用WebService的例子
- 调试ffmpeg与Makefile中的STRIP
- 一个简单的COM程序
- 移动互联网
- 对于防止SQL注入的研究(JAVA代码实现)
- 08年股市总计,09年股市展望
- hibernate netbeans
- 常用的CSS样式备份
- 嵌入式行业里面的应用&驱动&硬件工程师对比
- 习惯的力量 影响35岁前成功的好习惯与恶习
- sql临时表:SQL SERVER临时表的使用