WEB开发网
开发学院软件开发VC IUnknown—COM和MFC 阅读

IUnknown—COM和MFC

 2006-07-21 11:43:14 来源:WEB开发网   
核心提示:问题:我用MFC编写COM程序有一段时间了,知道如何使用宏和嵌套类,IUnknown—COM和MFC,以及如何在嵌套类中处理IUnknown接口,但对IUnknown的使用还是不太老练,为简单起见,假设使用的是进程内服务器,假设CMyClass是一个COM服务器,从CCmdTarget派生

问题:

我用MFC编写COM程序有一段时间了,知道如何使用宏和嵌套类,以及如何在嵌套类中处理IUnknown接口,但对IUnknown的使用还是不太老练。

假设CMyClass是一个COM服务器,从CCmdTarget派生。它实现了IMyInterface。CMyClass的定义如下:

class CMyClass: public CCmdTarget
{
BEGIN_INTERFACE_PART(...)
STDMETHOD....
END_INTERFACE_PART
DECLARE_INTERFACE_MAP
} ;

因为CCmdTarget没有QueryInterface方法,CMyClass也没有这个方法。我的问题是:这个COM服务器的客户端总是要调用QueryInterface,它不调用ExternalQueryInterface, 也不调用 InternalQueryInterface。因此如果QueryInterface不是一个CMyClass的有效方法。这种情况该怎么处理?

解答:

关于QueryInterface的这个问题,除你之外的许多人都对它感到困惑。但是不用怕,读完本文就可以见分晓。导致困惑的一个潜在的问题是CCmdTarget本身不从CObject派生,并且两者都有不同于QueryInterface的虚函数——例如,CObject中的第一个虚函数是GetRuntimeClass,CCmdTarget中的第一个虚函数是OnCmdMsg。所以从CCmdTarget派生出来的类怎么可能是COM类呢?而且还必须实现头三个虚函数是AddRef, Release, 和 QueryInterface的IUnknown接口:

实际上,解开这个谜团的方法很简单,但要求深入了解MFC类库。为此,我们必须进入MFC考察一番,主要目的是看看在调用CoCreateInstance创建类实例的时候会发生一些什么事情。

首先,CoCreateInstance所做的第一件事情(或多或少)是到注册表中检查哪个DLL实现你的类。为简单起见,假设使用的是进程内服务器。CoCreateInstance加载你的DLL并调用特殊函数DllGetClassObject.。

1 2 3 4 5  下一页

Tags:IUnknown COM MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接