- 浏览: 228805 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
thebye85:
引用 另外一个需要注意的问题,就是SessionMap和隐藏对 ...
WebWork深度探索之Session -
lanxiaoshuang:
写的真好
说的都是概念——有关编程范式 -
lhz:
grep unique wc你需要的只是这么几个小工具而已
努力做个Pragmatic Programmer
昨天向COM的世界迈出了第一步,虽然没有想象中那样举步维艰,却也走得不轻松。在初步了解DirectX的基础——COM之后,再次将注意力转到DirectX上来。正如一篇介绍COM的文章所说的,使用COM远比了解COM要简单得多。确实,在DirectX中使用COM都是那样的自然,跟一般函数的调用并无二致。但是,使用起来很自然还是没有阻止自己脑袋瓜中不断涌出的问号。大家看以下代码:
if( FAILED(lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID *) &lpdd)))
{
//error handle and return
}
代码很简单,就是调用了QueryInterface方法去获得DirectDraw7的接口指针。然而我第一眼看过去的时候,总是觉得有点别扭。大家再看一下,我昨天实现第一个COM对象的时候override的QueryInterface方法:
{
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);
}
我觉得别扭是因为第二个参数少了个dereference操作符,尽管LPVOID就是void *,但是通过使用typedef关键字将其定义为LPVOID,确实让代码可读性更高了。这是我想到第一个问题;
接着就是一个感觉很低级的问题了:QueryInterface为什么要使用指针的指针作为参数呢?直接用指针不行吗?如果仅仅是为了在函数体中能够改变参数,使用指针就足够了。那是因为什么呢?我们从如下形式的QueryInterface方法来看:
HRESULT QueryInterface( REFIID riid,LPVOID *ppvObj);
第一,ppvObject这个参数的含义是接口指针的地址(Address of a pointer to fill with the interface pointer)。从这个角度而言,第二种函数形式就更为容易理解了,由于"*"为解引用操作符,作用于ppvObject,得到的类型正好就是一个接口指针了(与LPVOID相对应);
第二,QueryInterface如果执行成功,就会将相应的接口指针赋给参数*ppvObject,如果仅仅是传递接口指针本身,而非接口指针的地址,就无法在函数体中对其进行赋值了。大家看以下代码:
{
public:
virtual void sayHi();
};
class Y:public X
{
public:
void sayHi();
};
(Test.hpp)
#include "Test.hpp"
using namespace std;
void X::sayHi()
{
cout << "Hi, My name is X." << endl;
}
void Y::sayHi()
{
cout << "Hi, My name is Y." << endl;
}
void change(X *x)
{
x = new Y;
}
void main()
{
X* a = new X;
a->sayHi();
change(a);
a->sayHi();
}
大家会觉得输出是什么呢?我们所期待的Y给大家的问候语并没有出现,就剩下X在唱独角戏。不管如何折腾,Y就是不会出现。如果使用了指针的指针,我们就可以得到体现多态的结果了。
PS:其实这是一个很简单的问题,但是通过摸索让自己对双重指针有了进一步的认识,以前就知道双重指针的定义就是指针的指针,至于它为什么会存在,一点想法都没有。在瞎胡闹的过程中,同时还强化了一个概念,就是运算符的优先级,类型转化的优先级要比"->"和"."要低。
我还是C++方面的菜鸟,各位高手看了,笑笑就好了,别笑太大声哦。 :)
发表评论
-
在String的面前丢脸
2004-06-18 00:39 1271重返C++的世 ... -
Summary of function parameter
2004-07-14 02:33 1144对C++这位入 ... -
此Vector非彼Vector
2004-08-05 15:51 1053在学习STL的过程中,我发现了一个熟悉的面孔— ... -
模板——泛型和STL的基础
2004-08-07 01:01 1338所谓泛型,从字面上可以猜想,就是泛化的类型(型 ... -
让人头痛的Vector(提问篇)
2004-08-07 16:55 1235在写完了此Vector非彼Vector这篇随笔 ... -
我该怎样shuffle呢
2004-08-10 01:47 1206在STL的Algorithm中有着这样的一种算 ... -
WebWork初体验
2004-08-11 17:43 1301在这篇ASP.NET ... -
WebWork深度探索之盲人摸象
2004-08-12 23:54 1148昨天尝试着利用WebWork做了一个小功能[1 ... -
WebWork深度探索之号外
2004-08-14 09:03 1054昨天开始对WebWork进行了一些初步的探索[ ... -
WebWork深度探索之标签库
2004-08-15 00:28 1536由于WebWork本身提供了一套自定义的标签库 ... -
什么是Law of Demeter
2004-08-15 14:22 1242今天一如昨日,继续对WebWork进行小打小闹 ... -
所谓的Dumb Question
2004-08-15 17:16 1040为了能够更 ... -
WebWork深度探索之标签库(续)
2004-08-16 15:58 1133昨日对WebWork的标签库进行了小小的研究[ ... -
WebWork深入探索之初见端倪
2004-08-19 16:35 922使用WebWork进 ... -
建网站的小Tips
2004-08-20 23:58 1040这几天都在忙着做一个小网站,从网页美工到后台处 ... -
URL与RequestDispatcher
2004-08-21 23:58 1007今天照例继续自己的网站建设之旅,原本以为可以大 ... -
WebWork深度探索之Pitfall
2004-08-25 14:31 979在使用WebWork进行开发的过程中,她的种种 ... -
WebWork深度探索之Session
2004-08-26 15:38 1528昨天上午刚 ... -
搞笑的textarea标签
2004-08-31 18:17 1587很久没有用 ... -
两天四疑问
2004-09-03 10:56 10029月份的前两天,我仍然做着网站开发的工作。在开 ...
相关推荐
IUnknown是所有COM接口的基础,它定义了三个基本的方法:QueryInterface、AddRef和Release。其中,QueryInterface是用于询问组件是否实现了指定的接口。当客户端想要访问组件的特定功能,即使用特定接口时,就会调用...
COM技术 C++实现,很好的COM学习资料
在所有接口的虚函数表(vtbl)中,`QueryInterface`的地址都指向组件实现的单个`QueryInterface`函数。因此,所有接口调用`QueryInterface`都会执行相同的逻辑,符合上述规则。 在COM组件的版本控制中,接口通常是不...
接口由一组方法组成,每个方法代表一种特定的功能。 3. **GUID**:全局唯一标识符,用于区分不同的接口和组件,确保在整个系统中不重复。 4. **IUnknown**:所有COM接口的基础,提供AddRef、Release和...
确保在不再需要BPL时,且所有由BPL创建的对象已被释放后才执行`FreeLibrary`。 在上述的第三种方法中,由于我们使用了接口,所以必须先释放接口,再卸载BPL。因为如果先卸载BPL,那么接口引用的实现可能会被破坏,...
首先,我们需要实例化一个`QAxWidget`对象,然后使用`setControl()`方法设置其为Excel应用的ActiveX控件。接下来,使用`queryInterface()`获取`Application`对象,通过这个对象我们可以打开并操作Excel文件: ```...
5. QueryInterface方法:理解如何通过该方法获取对象的其他接口。 6. 错误处理:了解COM错误处理机制,如HRESULT和 AtlThrow。 通过实践C++ Dynamic binding中的例子,你可以更深入地理解这些概念。编写和调试涉及...
在类的定义中,还需要实现`IUnknown`接口的三个基本方法:`QueryInterface`、`AddRef`和`Release`,它们用于接口的引用计数和类型识别。 `QueryInterface`方法用于获取接口指针,`AddRef`和`Release`分别用于增加和...
"吉林大学软件系统构造方法" 吉林大学软件系统构造方法是软件系统设计和开发的重要组成部分。本文将从COM(Component Object Model)组件对象类型、CORBA(Common Object Request Broker Architecture)公共对象...
在DirectShow中,Filter之间通过QueryInterface方法来确定彼此的能力和交互方式。例如,当一个Filter想要与另一个Filter通信时,它会调用QueryInterface来检查对方是否支持特定的接口,如IAMFilterGraph或...
3. **查询ITypeInfo接口**:调用IUnknown的QueryInterface方法,传入IID_ITypeInfo(ITypeInfo接口的ID)作为参数,可以得到ITypeInfo接口的指针。ITypeInfo接口提供了关于COM对象类型信息的访问。 4. **获取类型...
我们可以通过`IUnknown`接口的`QueryInterface`方法来获取特定的接口指针。 ```cpp IUnknown* pUnk = m_MyCtrl.GetControlUnknown(); CComQIPtr<_DCollectData> spDCollectDataCtl(pUnk); ``` 这里,`_...
IUnknown接口的QueryInterface方法是客户端与组件进行交互的主要途径。当客户端需要访问组件的其他接口时,也会通过IUnknown来完成。每个接口的虚函数表(vtbl)的前三项通常为QueryInterface、AddRef和Release,这是...
在宿主应用程序中,通过`CoCreateInstance`创建控件实例,然后使用`QueryInterface`获取`IDispatch`接口,就可以调用控件的方法了。 总结,理解OCX的调度方法和类型匹配是成功利用OCX控件进行Windows应用程序开发的...
每个接口由一组方法组成,这些方法定义了组件可以执行的操作。接口通过ID(接口标识符,如IID)进行识别。 2. **类工厂(Class Factory)**:COM组件的实例化是由类工厂来完成的。类工厂是实现COM接口IClassFactory...
本篇将详细阐述两种在MFC中添加网页的方法:手动创建和使用快捷控件(ActiveX)。 首先,我们来看手动创建网页的方法。这种方法通常涉及到对MFC的CWnd类进行派生,并实现自己的Web浏览器窗口。步骤大致如下: 1. ...
2. 获取接口指针:使用QueryInterface方法获取需要调用的接口。 3. 调用方法:通过接口指针调用COM对象提供的方法。 接下来,回调(事件)的实现涉及以下几个步骤: 1. 寻找连接点:客户端使用IUnknown::...
面向对象方法学中,COM(Component Object Model,组件对象模型)是一种重要的软件组件化方法,它允许开发者通过接口和组件来构建应用程序。COM组件的结构由接口和实现两部分组成,其中接口是组件对外的窗口,提供了...