- 浏览: 227173 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
我们都知道.NET被称为更好的COM,而OLE、ActiveX等技术是以COM为基础的,大名鼎鼎的DirectX也大量使用了COM。尽管.NET战略让COM的地位日益下降,我们还是需要将足够的注意力放到COM的上面。由于工作的需要,我要开始关注DirectX的内容了,而COM又是基础,了解COM就成了首要的任务。
以前觉得COM很神秘,只是知道一些基本的概念:COM是Component Object Model的缩写;COM不是一种新的语言,而是一种标准;标准定义了对象的模型以及对构造对象的语言的要求,只要依据这样的标准而设计的软件都会具备跨语言和跨进程的对象交互能力,即二进制级别的代码共享。
这些基本的概念只能够给人一点抽象的认识,那么依照COM的标准实现的代码会是怎么样的呢?
第一、COM包含了COM Object和COM Interface两部分,在COM Interface定义了一组函数原型,但没有提供这些函数的具体实现,而implementation(具体实现)则留给了COM Object。一个COM Object可以实现一个或者多个COM Inteface,而且一旦实现某个接口,就必须提供该接口定义的所有方法的实现,这样的行为在C++中是通过纯虚函数来实现的。如果你有Java的基础会发现,这跟Java中的Interface的行为是何等的相似;
第二、通过COM Interface的指针对COM Object进行访问。系统会维护一张与Interface相应的Function Table,而这张表实质就是一个function pointer的数组,这个数组里面包含的函数指针指向了相应的Interface的实现方法,如下图所示:
一个COM Object可能会实现多个Interface,如图中的ObjectB,而一个Interface有可能有多个COM Object提供了实现,如图中的InterfaceX;
第三、一个COM Interface必须继承IUnknown接口,而在IUnknown接口中包含了三个很重要的函数:QueryInterface、AddRef和Release。这三个函数会在后面给出的例子中看到。
讲了那么多,还是没有看到COM的庐山真面目啊,就让我们用一段代码来揭开它的面纱吧:
// {806E1B52-5100-4766-ADD7-E1765AF2A08B}
static const IID IID_IX =
{ 0x806e1b52, 0x5100, 0x4766, { 0xad, 0xd7, 0xe1, 0x76, 0x5a, 0xf2, 0xa0, 0x8b } };
// {F86FE046-C8C0-4a9b-8936-D747269C1981}
static const IID IID_IY =
{ 0xf86fe046, 0xc8c0, 0x4a9b, { 0x89, 0x36, 0xd7, 0x47, 0x26, 0x9c, 0x19, 0x81 } };
interface InterfaceX : IUnknown
{
virtual void Fx() = 0;
};
interface InterfaceY : IUnknown
{
virtual void Fy() = 0;
};
(SimpleInterface.hpp)
class ComObject : public InterfaceX,
public InterfaceY
{
private:
ULONG refCount;
public:
virtual HRESULT __stdcall QueryInterface(const IID &iid, void ** iface);
virtual ULONG __stdcall AddRef();
virtual ULONG __stdcall Release();
void Fx();
void Fy();
};
(FirstCOM.hpp)
#include <iostream>
using namespace std;
HRESULT __stdcall ComObject::QueryInterface(const IID &iid, void ** iface)
{
if(iid == IID_IX)
*iface = (InterfaceX*) this;
else
if (iid == IID_IY)
*iface = (InterfaceY*) this;
else
*iface = 0;
return E_NOINTERFACE;
((IUnknown*) (*iface))->AddRef();
return (S_OK);
}
ULONG __stdcall ComObject::AddRef()
{
cout << "Add one reference" << endl;
return(refCount++);
}
ULONG __stdcall ComObject::Release()
{
cout << "Release one reference" << endl;
if (--refCount == 0)
{
delete this;
return 0;
}
else
return refCount;
}
void ComObject::Fx()
{
cout << "Fx() is being called!" << endl;
}
void ComObject::Fy()
{
cout << "Fy() is being called!" << endl;
}
(FirstCOM.cpp)
void main()
{
InterfaceX *ix = NULL;
InterfaceY *iy = NULL;
ComObject* comObject = new ComObject;
comObject -> QueryInterface(IID_IX, (void **) &ix);
ix-> Fx();
ix-> Release();
comObject -> QueryInterface(IID_IY, (void **) &iy);
iy -> Fy();
iy -> Release();
comObject ->Release();
}
(Test.cpp)
以上代码中的COM Object并没有什么实际的意义,但是从中我们可以知道COM Inteface和COM Object是个什么模样。诚然这只是冰山一角,至少我们和COM的距离已经不再是那样遥远了。
PS:因为是刚刚开始接触COM,写得不对的地方,还请各位高手多多指教了。/Bow
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1264重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1141对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1046在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1326所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1229在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1180在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1290在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1127昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1039昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1530由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1232今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1033为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1128昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 893使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1034这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1002今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 957在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1523昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1582很久没有用 ... -
两天四疑问
2004-09-03 10:56 9939月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
这些内容对于初学者来说至关重要,因为正确安装和配置是使用Linux的第一步。 第三讲将讲解Linux的图形环境,如X-Window、KDE和GNOME的概念和特点,以及如何使用KDE进行日常操作。这些图形界面使得Linux更易于普通...
FPGA产品跨入第十代.pdf
中考历史第十一单元跨入近代社会的门槛复习课件北师大版
九年级历史上册 第一单元 跨入近代社会的门槛 第4课 为民族独立而战名师教案 北师大版.doc
2017秋九年级历史上册第一单元跨入近代社会的门槛第5课为争取“民主”“共和”而战教案北师.pdf
标题和描述中提到的“电气设备行业:硅片即将跨入166时代,隆基引领M6单晶硅片变革”是一个关于光伏行业的专题报告,聚焦于硅片技术的最新发展,特别是隆基公司在M6单晶硅片领域的创新与领导地位。在这个主题下,...
云服务跨入“可信”时代.pdf
本文介绍了为抢占市场份额,壮大企业规模,一方面华冠连锁公司加快了开设连锁分店的步伐,另一方面也开始向物流、生产等上游产业链发展。然而,在公司高速发展的快车道上不可避免的遇到了如何提升企业运营效率、降低...
茶产业跨入电子商务新领域.pptx
总之,《五年跨入高薪族》是一本面向年轻人的实用指南,它教导读者如何在职场中制定有效的策略,通过合理的职业规划和持续的努力,有望在五年内步入高薪阶层。这本书对于面临就业压力和职业规划困扰的青年来说,具有...
《从MWC2022探索行动通讯跨入元宇宙的挑战》 移动世界大会(MWC)2022为我们...随着技术的不断进步和创新,我们可以期待一个更加完善、沉浸式的元宇宙世界,但同时也需要关注并解决这些挑战,以确保元宇宙的健康发展。
跨入太空通信(“电话”文档)共29张.pptx
随着信息时代的到来,企业对信息系统的需求日益增加,SigmaNEST作为一款先进的信息系统解决方案,旨在帮助企业快速跨入信息时代。SigmaTEK总裁Ben TerreBlanche先生在接受采访时,强调了SigmaNEST的重要性和优势。 ...
《五年跨入高薪族》是一本针对技术领域,尤其是人力资源管理专业的电子书籍,旨在帮助读者,特别是初入职场的年轻人,规划自己的职业生涯,以便在五年内实现收入的显著提升。书中的内容涵盖了一系列有助于实现这一...
从MWC2022探索移动通讯跨入元宇宙的挑战.pdf
跨入无线网络快车道802.11n无线路由器导购.pdf
Fortran分布式计算:跨入并行处理的新纪元(PDF文档) Fortran语言,作为科学和工程计算的基石,其在分布式计算领域的应用至关重要。分布式计算允许Fortran程序利用多个物理或逻辑上分离的计算资源来执行大规模计算...
Fortran分布式计算:跨入并行处理的新纪元《PDF文档》 Fortran语言,作为科学和工程计算的基石,其在分布式计算领域的应用至关重要。分布式计算允许Fortran程序利用多个物理或逻辑上分离的计算资源来执行大规模计算...
标题《中医如何从“原始状态”跨入“人工智能”的未来》所涉及的知识点主要包括中医现代化、人工智能技术在中医中的应用、以及脉诊仪的发展现状和未来趋势。以下是对这些主题的详细解读。 首先,中医作为一门古老的...