各位DX:
    小弟上次曾经问过 CoCreateInstance 的基本作用,现在是对 CoCreateInstance 的调用结果的一些疑问。
    CoCreateInstance 方法里面的第一个参数是 GUID
(比如:934A9523-A3CA-4bc5-ADA0-D6D95D979421),系统根据这个 GUID 到本地机器的注册表中寻找与这个 GUID 匹配的注册项,在我使用的机器上,找到了这个注册项,该注册项下面有三个子项,分别是 
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{743F1DC6-5ABA-429F-8BDF-C54D03253DC2}\InProcServer32
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{743F1DC6-5ABA-429F-8BDF-C54D03253DC2}\ProgID
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{743F1DC6-5ABA-429F-8BDF-C54D03253DC2}\VersionIndependentProgID
在 InProcServer32 中有两个键,其中一个是 REG_SZ 类型的,键值是 dpnetd.dll 
那么是不是就是说
CoCreateInstance(CLSID_DirectPlay8Address, NULL, 
                 CLSCTX_ALL, IID_IDirectPlay8Address,
                 (LPVOID*) &pDP8AddressLocal)
的用途就是根据这个 GUID 找到相关的 DLL 文件,然后把这个 DLL 文件的使用句柄入口赋值给
pDP8AddressLocal,然后 pDP8AddressLocal 就可以调用这个 DLL 里面的方法了?不知道我的理解对不对,往大家指正,谢谢^_^

解决方案 »

  1.   

    可以参看vc技术内幕和
    COM技术内幕2本书
      

  2.   

    不对,DLL对你的调用程序来说是透明的。
        CoCreateInstance其实是几个过程调用的组合。它首先加载DLL(也可能是EXE),获取其DllGetObjectClass的导出函数地址并调用之,得到实现了IClassFactory接口的类厂对象。然后调用IClassFactory::CreateInstance,得到相应COM组件对象的接口指针。
      

  3.   

    CoCreateInstanc创建COM对象,是一个组合的过程,诸如Dll操作之类的事情对于主调是不可见的。
      

  4.   

    刚才恶补了一下 COM 的原理,最新理解如下:
    CoCreateInstance 在内部调用 CoGetClassObject 方法。
    CoGetClassObject  方法 根据传入的 CLSID 到本地机器的注册表找到对应的 CLSID,如果是进程内组件,那么找到对应的 DLL,CoGetClassObject 调用 DLL 模块的 DllGetClassObject 引出函数,把参数 CLSID、IID 和 PPV 传给 DllGetClassObject 函数,并返回类厂对象的接口