通过已知接口对象判断其是否为指定的CLSID类型

来源:互联网 发布:java怎么格式化字符串 编辑:程序博客网 时间:2024/05/16 06:21

            今天对项目代码进行整理优化,把通用的代码按照用途进行分类封装成通用库,以方便其其他模块的调用,并为以后的项目做技术积累。

        项目使用了一套Activex封装的多文档框架,里面所有的浮动窗口都是从IXXDockWndTabDef接口继承实现的类,在不同的插件(Atl写的工具条、右键菜单和菜单命令)模块中基本都要涉及到其他浮动窗口的访问操作,一般情况下都是通过接口的装换(也就是系统内部自动进行QI操作)的值是否为NULL来判断,如下:

long  nCountWnd=IXXFramework->GetDockWindowCount();for(int i=0;i<nCountWnd;i++){      IXXDockWndTabDefPtr   ipDockWndTabDef=IXXFramework->GetDockWndItem(i);      IXXLayerDockWndTabDefPtr   ipLayerDockWnd(ipDockWndTabDef);      if(ipDockWndTabDef)      {  // to  do  ...         ............         break;      }}

     这样的操作的前提知道具体接口类型(还需要引用其头文件),然后进行转换,这样对于单个模块来说没有问题,但是对于一个大的工程来说,这么高的使用频率的就需要抽取出来,而且也有利于后期的代码维护。

      这里提供一下我的解决思路,通过已知接口对象调用QueryInterface方法来通过clsid来判断是否成功!

函数原型: HRESULT QueryInterface( REFIID iid, void** ppvObject);

 代码如下:

long nCountWnd=IXXFramework->GetDockWindowCount();for(int i=0;i<nCountWnd;i++){      IXXDockWndTabDefPtr   ipDockWndTabDef=IXXFramework->GetDockWndItem(i);      IXXLayerDockWndTabDefPtr   ipLayerDockWnd(ipDockWndTabDef);      IUnknownPtr  ipUnknow;      IID  iid=__uuidof(IXXLayerDockWndTabDef);      HRESULT hr=iDockableWinTabDef->QueryInterface(iid,(void**)&ipUnknow);      if (SUCCEEDED(hr))      {        // to  do  ...         ............         break;      }}
函数封装的时候只需要传递一个clsid就可以获取到 相应的接口对象了






0 0
原创粉丝点击