打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
CoGetClassObject解析
userphoto

2012.02.28

关注

MSDN上没有CoGetClassObject函数的源码,资料上又说CoGetClassObject调用DllGetClassObject函数.不知这其中是如何调用地?
//=================
查了一些资料
摘录1如下:
----------
CoCreateInstance API函数将调用CoGetClassObject API,这个调用过程我们是看不到相关的代码的,因为微软已经把他封装好了。而CoGetClassObject函数的作用是什么呢?它将调用 LoadLibrary来寻找我们指定的COM组件(DLL),然后使用GetProcAddress 来寻找组件的入口函数 - 其中的DllGetClassObject 函数就在这里将被调用。

摘录2如下:
----------
CoGetClassObject及CoCreateInstance中都有对LoadLibrary和 GetProcAddress进行调用。其中LoadLibrary的参数为DLL的名称,而CoGetClassObject及 CoCreateInstance则使用它们的第一个参数(一个CLSID),组件可以用CLSID作为索引在Windows注册表中发布包含它们的 DLL文件名称。CoGetClassObject及CoCreateInstance将用CLSID作为关键字在注册表中查询所需的DLL文件名称。
//================
当CoGetClassObject调用DllGetClassObject后,发现指针与句柄的关系就是(句柄是指针的指针)
从这俩个函数的参数就可以看出
STDAPI CoGetClassObject(
  REFCLSID rclsid,
  DWORD dwClsContext,
  COSERVERINFO * pServerInfo,
  REFIID riid,
  LPVOID * ppv
);
STDAPI DllGetClassObject(
  const CLSID & rclsid,  
  const IID & riid,      
  void ** ppv
); 
具体函数例子:
IClassFactory    *classFactory;
CoGetClassObject(&CLSID_IExample, CLSCTX_INPROC_SERVER, 0, &IID_IClassFactory, &classFactory) 

HRESULT PASCAL DllGetClassObject(REFCLSID objGuid, REFIID factoryGuid, void **factoryHandle)
{
    register HRESULT        hr;
    if (IsEqualCLSID(objGuid, &CLSID_IExample))
    {
        hr = classQueryInterface(&MyIClassFactoryObj, factoryGuid, factoryHandle);
    }
    else
    {
        *factoryHandle = 0;
        hr = CLASS_E_CLASSNOTAVAILABLE;
    }
    return(hr);
}

CoGetClassObject中的参数&classFactory 与DllGetClassObject中的参数void **factoryHandle

//=====================
CoGetClassObject要加载DLL,但是我们并没有给他传递DLL的路径(DLL相关请参考DLL-使用DLL)。所以它要用参数clsid(即组件id,它是从CoCreateInstance传递过来的)去注册表找到这个组件DLL路径(请见:COM笔记-Widows注册表),然后把DLL加载起来。

       加载起来之后我们就可以调用DLL的导出函数DllGetClassObject。并把clsid(组件ID),IID_IclassFactory(接口ID)传递它。(可以看一下DllGetClassObject的实现,看看COM笔记-类厂源代码)。

  DllGetClassObject执行成功则返回类工厂接口pIFactory(见图)。

接着就是 类工厂接口pIFactory 调用 它的方法CreateInstance,去创建我们需要的组件,并返回我们需要的接口了。(同样可以看看COM笔记-类厂源代码

  关于参数punkonwnDuter这个没用传递CoGetClassObject,而是传递给了类厂的一个方法CreateInstance,主要是聚合方面的东西。(见:COM笔记-包容与聚合

   参数dwClsContext限定所创建的组件的执行上下文。(见:COM笔记-CoCreateInstance

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
零基础学习COM之COM库和类厂介绍
CoCreateInstance 做了什么 菜菜的 - zharP的专栏
CoCreateInstance 和 CoGetObject
无招胜有招: 看我如何通过劫持COM服务器绕过AMSI
CoCreateInstance 跟踪笔记
利用 DirectShow 开发自己的 Filter
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服