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 ...
随机推荐
- STL--lower_bound()&upper_bound();
又是两个黑科技一般的存在. 首先我们来介绍一下这两个函数: ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& ...
- html中target的用法
- DLL分配的内存如何在EXE里面释放
总结下面几个要点: 1. 保证内存分配和清除的统一性:如果一个DLL提供一个能够分配内存的函数,那么这个DLL同时应该提供一个函数释放这些内存.数据的创建和清除应该在同一个层次上. 曾经遇到过这样的例 ...
- POJ 2392【多重背包】
题意: k个块,给出每个块的高度hi,数量ci,不能超过的高度: 求这些块可以组成的最大高度一个. 思路: 大致可看这个题是一个背包,背包的承重是高度. 对于每个物品,有他的价值是高度,还有限定的数量 ...
- poj1511【最短路spfa】
题意: 计算从源点1到各点的最短路之和+各点到源点1的最短路之和: 思路: 源点这个好做啊,可是各点到源点,转个弯就是反向建边然后求一下源点到各点的最短路,就是各点到源点的最短路,在两幅图里搞: 贴一 ...
- POJ1017 【据说是贪心...】
题意: 有6种面积的格子,给出这些格子的数量,然后有6*6的格子去容纳这6种面基,问最少需要几个6*6格子,使得所有类型的小格子被容纳. 思路: 按照面积的从大到小放. 一开始还是太天真,还要用各种1 ...
- bzoj 4622: [NOI 2003] 智破连环阵【dfs+匈牙利算法】
一个炸弹炸一个区间的武器,想到二分图匹配 但是直接dfs断点显然不行,预处理出dis[i]为i到m的至多值来最优性剪枝,并且标记ok[i][j]为炸弹i可以炸到j武器,mx[i][j]为i炸弹从j武器 ...
- 纯javaScript实现元素平滑滚动,改进前两个版本,支持鼠标滚轮滚动和点击元素滚动,滚动更顺畅
windowScroll(id, number, distance, direction, obj) 参数介绍: 1.id:所要滚动的元素id; 2.number:滚动次数; 3.distance:每 ...
- Luogu P1373 小a和uim之大逃离【dp】By cellur925
题目传送门 $50pts$:容易设计出状态$f[i][j][l][r][st]$表示当前的这个人在($i$,$j$),小a和uim魔瓶中的含量分别为$l$,$r$,当$st=0$表明现在是小a在吃,当 ...
- notepad++插件选项没有plugin manager解决
在 https://github.com/bruderstein/nppPluginManager/releases 下载最新的PluginManager_vXXXX_UNI.zip 解压,将里面的p ...