学习笔记 Real COM with the MFC Library (译一)

来源:互联网 发布:古筝节拍器软件下载 编辑:程序博客网 时间:2024/05/16 12:45

  如此多的模拟,现在我们将把spaceship的例子转换成真实的而非模拟的COM。在我们开始之前,你需要掌握一点更多的知识。首先你必须学习CoGetClassObject方法,然后你也必须知道COM是如何通过windows Registry载入组件的;再然后也要知道,而且是必须知道进程内(in-process)组件(一个dll)和进程外(out-of-process)组件(一个EXE和DLL)的不同之处。最后还要让自己熟悉MFC的macro,因为它支持类嵌套。


  COM里的CoGetClassObject方法

  在我们以前的模拟中,我们用的是一个名叫GetClassObject的假设方法,而在真正的COM内,我们用的则是CoGetClassObject方法(Co代表"component object")。把我们以前看过的GetClassObject方法的原型和下面的原型作一下对比:

STDAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, COSERVERINF* pServerInfo, REFIID riid, LPVOID* ppvObject)

       接口的指针放在ppvObject参数内;pServerInfo指向一个机器,该机器存放现在将要调用的类对象(赋值NULL表示本机器);类型REFCLSID和REFIID指的是128位GUID(globally unique identifiers)(COM内的类和接口的全局唯一标识符);STDAPI 表示该方法将返回32位HRESULT类型的值。

       定义在windows库中的标准GUID(比如,Microsoft已经创建的那些命名接口的GUID)将被动态的链接在你的程序内。自定义类和接口的GUID,比如sapceship对象中,必须在你的程序内通过这样来定义:

//{692D03A4-C689-11CE-B337-88EA36DE9E4E}
static const IID IID_IMotion =
{0x692d03a4, 0xc689, 0x11ce, {0xb3, 0x37, 0x88, 0x4a, 0x36,
0xde, 0x9e, 0x4e}};

       如果dwClsContext参数为CLSCTX_INPROC_SERVER, COM内的残根(subsystem)会寻找一个DLL,如果参数为CLSCTX_LOCAL_SERVER,COM则会寻找一个EXE。为了提高执行的效率,这两个参数值可以结合起来考虑以便选择DLL或EXE中的一种。进程内方式的服务dll,因为每个人直接共享内存相同的地址空间,因此有着更快的速度。EXE通讯方式(进程外)的服务,则由于进程的调用包括数据的拷贝和许多不同进程环境的切换,因此速度要来得慢一些。返回值为HRESULT类型,如果没有错误发生该值为0(NOERROR)。

要点:还有一个COM方法,CoCreateInstance, 它含有CoGetClassObject和IClassFactory::CreateInstance的功能。

 

下一节:COM and the Windows Registry