各位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 里面的方法了?不知道我的理解对不对,往大家指正,谢谢^_^
小弟上次曾经问过 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 里面的方法了?不知道我的理解对不对,往大家指正,谢谢^_^
COM技术内幕2本书
CoCreateInstance其实是几个过程调用的组合。它首先加载DLL(也可能是EXE),获取其DllGetObjectClass的导出函数地址并调用之,得到实现了IClassFactory接口的类厂对象。然后调用IClassFactory::CreateInstance,得到相应COM组件对象的接口指针。
CoCreateInstance 在内部调用 CoGetClassObject 方法。
CoGetClassObject 方法 根据传入的 CLSID 到本地机器的注册表找到对应的 CLSID,如果是进程内组件,那么找到对应的 DLL,CoGetClassObject 调用 DLL 模块的 DllGetClassObject 引出函数,把参数 CLSID、IID 和 PPV 传给 DllGetClassObject 函数,并返回类厂对象的接口