COM接口中的信息获取

大家都知道,作为客户端使用COM服务时,需要通过 QueryInterface 获取到组件支持的COM接口,然后再调用其提供的各种方法来完成功能。但各种COM服务都支持哪些接口呢?这个信息一般比较难直接获取到,通常是到处查找资料,参看人家的例子,然后自己再不停的做试验,效率非常低。

在开发Visual Studio的插件过程中,也需要通过 IServiceProvider::QueryService 获取到DTE提供的各种服务,据说总共有130多种服务,而很少有资料介绍到底怎么获取这些服务。

在开发DirectShow Filter 和 Visual Studio、IE 等插件时,容器也希望我们能提供相应的接口(比如属性页等),可他希望我们提供什么呢?


以上种种问题,促使我编写了一些辅助的宏和类,帮助从COM接口中获取各种信息,比如:

  1.这个接口能QueryInterface到的接口及辅助信息(如IDispatch支持的方法、属性,连接点容器中支持的Events类型等), 这是最常见的使用方式;

  2.能QueryService到的各种服务,可在使用VSIP 开发 Visual Studio插件时使用

  3.外界容器希望我们能提供的服务,可在编写 DriectShow Filter 或 VS、IE 插件等时使用

  4.这个接口能 通过 IMoniker::BindToObject 的IID -- 这个功能我用得很少,也几乎没有怎么测试过:(

  

使用方式非常简单,只需 include "ftlComDetect.h" 文件,然后在需要检查的接口上使用对应的宏,运行后即可在Output窗口中看到对应的输出。比如如下代码:

    HRESULT hr = E_FAIL;
    CComPtr<IUnknown> spShellBrower;
    COM_VERIFY(spShellBrower.CoCreateInstance(CLSID_ShellDesktop));  //定义并创建 ShellDesktop 的实例

    //从自定义列表中检查这个接口能QI到的其他接口
    COM_DETECT_INTERFACE_FROM_LIST(spShellBrower);
    
    //从注册表(HKEY_CLASSES_ROOT\Interface)中枚举所有的接口ID,并检测这个接口是否能QI到
    COM_DETECT_INTERFACE_FROM_REGISTER(spShellBrower);  

在Output中会对应输出:

f:\mywork\comdetectdemo\comdetectdemodlg.cpp(102) : Begin Detect Interface spShellBrower( 0x00162A00 ) From List
1: IUnknown
2: IOleCommandTarget
3: IPersist
4: IStorage
5: IObjectWithSite
Total Check 725 Interfaces
f:\mywork\comdetectdemo\comdetectdemodlg.cpp(105) : Begin Detect Interface spShellBrower( 0x00162A00 ) From Register
1 : IUnknown
2 : IStorage
3 : IPersist
4 : IShellIcon
5 : IShellFolder
6 : IPersistFolder
7 : IPersistFolder2
8 : IItemNameLimits
9 : IShellFolder2
10 : IOleCommandTarget
11 : IObjectWithSite
Total Check 10637 Interfaces
spShellBrower's Interfaces Count are at least 11

可知 IShellFolder 至少支持 11 个接口,你想用哪个功能,找找吧:)


创建VisualStudio的实例,并检测其 接口能提供的服务的例子:

    CComPtr<IUnknown> spVSIPPackage;
    CLSID clsid; // 通过 ProgID 得到 CLSID
    COM_VERIFY(::CLSIDFromProgID( L"VisualStudio.DTE.9.0", &clsid ));
    ASSERT( SUCCEEDED( hr ) && TEXT("Run this in VS2008 Or will change ProgID"));
    
    COM_VERIFY(spVSIPPackage.CoCreateInstance(clsid));
    if (spVSIPPackage)
    {
        COM_DETECT_SERVICE_PROVIDER_FROM_LIST(spVSIPPackage);
        COM_DETECT_SERVICE_PROVIDER_FROM_REGISTER(spVSIPPackage);
    }


//输出如下所示:

f:\mywork\comdetectdemo\comdetectdemodlg.cpp(123) : Begin Detect Service Provider spVSIPPackage( 0x001679EC ) From Register
1 : IVsObjectManager
2 : _DTE
3 : IVsCommandWindow
4 : IVsRegisterFindScope
5 : IVsAddProjectItemDlg
6 : IVsStructuredFileIO
7 : IVsInvisibleEditorManager
8 : ICQryAutoFactory
9 : IVsHTMLConverter
10 : IVsLog
11 : IVsFileChange
12 : IUIHostLocale
13 : IVsEnumHierarchyItemsFactory
14 : IHxSession
15 : IHxRegisterSession
16 : IVsUIShellOpenDocument
17 : IVsIntelliMouseHandler
18 : IVsParseCommandLine
19 : SVsProfilesManagerUI
20 : IVsFontAndColorStorage
21 : SVsOnlineHelpData
22 : SVsSearchService
23 : Help
24 : SVsHelpPage
25 : IVsOutputWindow
26 : IVsRegisterScciProvider
27 : IVsMonitorSelection
28 : SVsWebProxy
29 : IVsComponentSelectorDlg
30 : SVsHelpOnlineF1Service
31 : IVsSolutionPersistence
32 : IVsLibraryReferenceManager
33 : IVsCmdNameMapping
34 : IVsToolbox
35 : IVsRegisterEditors
36 : IInternetSecurityManager
37 : IVsSolution
38 : IVsdDeployment
39 : ObjectExtenders
40 : IVsSolutionBuildManager
41 : IVsFileChangeEx
42 : IVsMonitorUserContext
43 : IVsTaskList
44 : IVsBuildEventCommandLineDialogService
45 : SVsStartPageDownload
46 : IVsRunningDocumentTable
47 : IVsdPackageManager
48 : IVsUIShell
49 : IVsDiscoveryService
50 : IVsPropertyPageFrame
51 : IVsAddWebReferenceDlg
52 : IVsFilterKeys
53 : IVsTextImageUtilities
54 : IVsAppCommandLine
55 : IProfferService
56 : IVsXMLMemberIndexService
57 : IVsStatusbar
58 : IVsUIHierWinClipboardHelper
59 : IVsExternalFilesManager
60 : IVsMenuEditorFactory
61 : IVsdDeployment
62 : IVsRegisterProjectTypes
63 : SourceControl
64 : IVsCodeShareHandler
65 : IVsLinkedUndoTransactionManager
66 : IVsShell
Total Check 10637 Interfaces  

 可知其至少提供了约60多个服务,开发Visual Studio Addin 的有福了,赶紧去看看,你想要的功能在哪个服务里吧:) 


源码和Demo的下载地址见:

   http://download.youkuaiyun.com/detail/fishjam/4150043

PS:

  1.今天只是上传资源和Demo程序演示使用方法(先授以鱼),改天再写文章,说说使用的一些注意点和扩展方式(再授以渔)。

  2.因为从自定义List中检测接口信息时需要包含对应的头文件,所以很多需要安装专门的SDK(比如 DirectShow、VSX 等)的接口检查默认是不启用的,如需要启用,需要定义对应的宏,如 define INCLUDE_DETECT_DDRAW    1 则会检查DirectDraw相关的接口

  3.如果发现问题,也请即时通知,我会尽快修改和回复。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值