COM技术开发(一)
COM :基本的接口(IX,IY), 组件的实现(CA),以及对组件的调用
#include "pch.h"
#include <iostream> #include <objbase.h> using namespace std; void trace(const char* msg) { cout << msg << endl; } //Interfaces start
interface IX :IUnknown
{
virtual void __stdcall Fx() = ;
}; interface IY :IUnknown
{
virtual void __stdcall Fy() = ;
}; interface IZ :IUnknown
{
virtual void __stdcall Fz() = ;
}; //Forward references for GUIDs
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
//Interface end //component start
class CA :public IX, public IY
{
LONG m_cRef;
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release(); virtual void __stdcall Fx() { cout << "Fx function" << endl; }
virtual void __stdcall Fy() { cout << "Fy function" << endl; }
public:
CA();
~CA() { trace("CA: Destory Self"); }
}; CA::CA()
{
trace("CA: Constrator Self");
m_cRef = ;
} 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 IX");
* ppv = static_cast<IY*>(this);
}
else
{
trace("QueryInteface Interface not supported");
* ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
} ULONG __stdcall CA::AddRef()
{
InterlockedIncrement(&m_cRef);
cout << "CA AddRef -- Ref:" << m_cRef << endl;
return m_cRef;
} ULONG __stdcall CA::Release()
{ if (InterlockedDecrement(&m_cRef) == )
{
delete this;
return ;
}
cout << "CA ReleaseRef -- Ref:" << m_cRef << endl;
return m_cRef;
} IUnknown* CreateInstance()
{
IUnknown* pI = static_cast<IX*>(new CA);
pI->AddRef();
return pI;
} // {05464095-EC3A-45b3-8E0C-D1793FBDF13D}
static const IID IID_IX =
{ 0x5464095, 0xec3a, 0x45b3, { 0x8e, 0xc, 0xd1, 0x79, 0x3f, 0xbd, 0xf1, 0x3d } }; // {39696224-3AE3-4b46-B056-99359CAC6CA9}
static const IID IID_IY =
{ 0x39696224, 0x3ae3, 0x4b46, { 0xb0, 0x56, 0x99, 0x35, 0x9c, 0xac, 0x6c, 0xa9 } }; // {6684A06D-64B8-46f3-9988-CDC119E18165}
static const IID IID_IZ =
{ 0x6684a06d, 0x64b8, 0x46f3, { 0x99, 0x88, 0xcd, 0xc1, 0x19, 0xe1, 0x81, 0x65 } };
//component end //client start
int main(int argc, char* argv[])
{
HRESULT hr;
trace("Client: Get an IUnknown pointer");
IUnknown* pIUnknown = CreateInstance();
IX* pIx = NULL;
trace("Client: Get Interface IX");
hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIx);
if (SUCCEEDED(hr))
{
trace("Client: Succeed Get Interface IX");
pIx->Fx();
} IY* pIY = NULL;
hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY);
pIUnknown->Release();
if (SUCCEEDED(hr))
{
trace("Client: Succeed GetInterface IY");
pIY->Fy();
pIY->Release();
} //Query IY from IX
IY* pIYfromIX = NULL;
hr = pIx->QueryInterface(IID_IY, (void**)&pIYfromIX);
if (SUCCEEDED(hr))
{
trace("Client: Succeed GetInterfae IY from pIX");
pIYfromIX->Fy();
pIYfromIX->Release();
}
pIx->Release();
//delete component
// delete pIUnknown;
return ;
}
//client end
参考资料:
1、COM程序的简单实现(COM技术内幕笔记之一)
2、COM组件开发(一)—— 对象与接口
COM技术开发(一)的更多相关文章
- IT技术开发人员获得成功的六大步骤
IT技术开发人士成功的6大步骤 一个前辈在移民加拿大后写的文章,写得不错,值得借鉴,转来给大家看看,也给自己 序言:经过001多年的洗礼,认识了这里这么多的JJMMGGDD,前几天刚得到签证, 无 ...
- 跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用
一.引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting. 二..NET Remoting 介绍 2.1 . ...
- 转:Google技术开发指南:给大学生自学的建议
原文来自于:http://blog.jobbole.com/80621/ 技术开发指南 想要成为成功的软件工程师,必须拥有坚实的计算机科学的基础.本指南针对大学生,给出一条自学途径,让学生以科班和非科 ...
- 用web技术开发出原生的App应用的体会(1)
本人是是个前端小白,学前端已经有半年的时间了,前几天开了个博客,希望记录自己学习历程的点滴. 今天要写的是关于用html,css,javascript等web技术开发原生的app应用. 总所周知,we ...
- Java技术开发程序员如果在2019年立足
2019年的互联网环境相对以往来说要更复杂一些,互联网领域也正在经历从消费互联网向产业互联网转型的阵痛期.其实不少公司从2018年开始已经在陆续进行结构化调整,这些调整中的重要内容就是岗位调整,而岗位 ...
- 未来-区块链-IBM:IBM 区块链技术开发社区
ylbtech-未来-区块链-IBM:IBM 区块链技术开发社区 1.返回顶部 1. 开始学习 IBM Blockchain 101:开发人员快速入门指南 这篇快速入门指南适合不熟悉区块链技术,希望快 ...
- React VR 技术开发群 579149907
React VR 技术开发群 579149907,欢迎加入讨论!分享经验!
- Java技术开发标准JSR介绍
JSR我们需要先提及JCP(Java Community Process SM(JCP SM)).JCP是为Java技术开发标准技术规范的机制.任何人都可以注册并参与审阅和提供Java规范请求(JSR ...
- web技术开发桌面应用
三款前端工程师桌面应用开发神器! http://mini.eastday.com/a/160630023107669-2.html 如果我告诉你,以后你们可以用前端语言(html5+css3+js)开 ...
- 微软开放技术开发了适用于 Windows Azure 移动服务的开源 Android SDK
发布于 2014-02-10 作者 陈 忠岳 为进一步实现连接微软与非微软技术的目标,微软开放技术有限公司开发了适用于 Windows Azure 移动服务的 Android SDK,由Scot ...
随机推荐
- 如何 Xcode 开发工具里安装一个空的项目末模板
很多朋友因为Xcode升级取消了空工程模板而发愁 今天给大家推荐一个简单方便的方法,导入空工程模板 对于 xcode7 来说可以使用下面的方法添加空模板.建议在升级的时候,不要下载beta版,最好下 ...
- 入口函数WinMain
int WINAPI WinMain() HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd ); ...
- Linux常用的18个命令(复习)
1. cd命令 它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切换到目录/root/Docements cd . ...
- linux中vfork对打开文件的处理
vfork和fork fork()函数是拷贝一个父进程的副本,拥有独立的代码段 数据段 堆栈空间 然而vfork是共享父亲进程的代码以及代码段 vfork是可以根据需要复制父进程空间,这样很大程度的提 ...
- E20180413-hm
skew adj. 斜的,歪的; [数学] 不对称的; [统计学] 歪斜,扭曲; vt. 歪曲; 曲解; 使歪斜; vi. 偏离,歪斜; 斜视; traversal n. 横越,横断物,(横 ...
- poj3050【dfs】
题意: 5*5的矩阵里,某个点能够上下左右走,走5步,然后路径会形成一个串,问你,这个5*5里面能够形成多少个不同个串. 思路: 直接暴搜,然后对于一个串塞到set里去,然后输出set里的个数就好了 ...
- hdoj【1006】【未完待续】
题意: 时钟的三个指针在两两之间至少D°的时候是开心的,求开心时间占一天的一个百分比. 思路: 我们看到这个百分比有三位小数,精度很高. 一天有24h,24*60min,24*60*60s,那么最小单 ...
- python __builtins__ set类 (60)
60.'set', 转换为集合类型 class set(object) | set() -> new empty set object | set(iterable) -> new se ...
- Luogu P3946 ことりのおやつ(小鸟的点心) 【最短路】By cellur925
题目传送门 日本的冬天经常下雪.不幸的是,今天也是这样,每秒钟雪的厚度会增加q毫米. 秋叶原共有n个地点,编号从1到n.每个地点在开始的时候的积雪高度为hi. 有m条双向道路连接这些地点,它们的长度分 ...
- $P2872\ [USACO07DEC]道路建设Building\ Roads$
\(problem\) 错的原因是\(RE\)(大雾 , 时刻谨记 \(N\) 个地方的话 保守开 \(\frac{N^2}{2}\) 大小. 因为是边. 边最多的情况即完全图 : $1+2+3+4. ...