知道一个COM借口ITest,如何知道它的clsid和iid
3x

解决方案 »

  1.   

    CLSID clsid;
    if(FAILED(::CLSIDFromProgID(L"Word.Document.8",&clsid)))
    AfxThrowMemoryException();
      

  2.   

    楼主所谓知道ITest是指什么意思?指知道IID?知道其完整定义(即struct)?如果是完整定义,那么一般会在struct前加上类似"0FCE81AF-3613-11D8-872A-0050BF2436C6"的字符串,否则无法知道其IID。
    如果已知IID,无法知道其CLSID,因为可以多个不同的组件都实现了这一IID,就如同如果已知IID_IUnknown,那又怎能说这个IID的接口是由某某组件实现的呢?任何组件都实现了这个IID所代表的接口
      

  3.   

    OLEVIEW可以看到
    CLSIDFromProgID中的programID可以用Lib和
    接口名字拼成
    OLEVIEW都可看到
      

  4.   

    实例化时必须知道CLSID和IID,这一般应由开发组件的人写的帮助文档获得,或者开发者顺便加了一个导出函数以方便创建实例。比如说DirectX就是一堆DLL,里面包含了多个COM组件,因此它也提供了DirectX的SDK文档,并也提供了诸如CreateDirect3D8之类的API以简化和帮助用户创建那种支持IDirect3D8接口的组件,这里用户就不需要知道IDirect3D8的IID和组件的CLSID。而平时我们用的ActiveX控件绝大部分都没有提供文档,但它们都带有类型库(一般融合进DLL中),可以用OleView进行查看类型信息,里面记录了这个ActiveX控件的CLSID、支持的接口的IID及接口布局,以及许多其他信息。对于使用这种ActiveX控件,由于没有文档,只有查看类型信息,根据接口的成员函数的名字和参数大致猜测它们的用法,而且ActiveX一般都是双接口,也就是实现了IDispatch,则使用时根据CLSID创建的实例接口(IDispatch*),再根据类型库查得欲调用函数的DISPID,通过IDispatch::Invoke调用,这样就不需要知道特定的IID。不过更一般的是通过智能环境(如VC)根据类型库生成包装类,简单地调用包装类的成员函数即可。
      

  5.   

    到hkey_classes_root/interface下面搜索,Itest,可能找到多个,即iid了。iid键的子健里能找到clsid。
      

  6.   

    To xuhx(一觉亮天)
        你说的方法只是针对自定义的接口且实现这个接口的组件使用的是标准列集法时才有效(虽然现在几乎所有COM组件的列集过程都是用标准列集法),而且我记着iid键下并不能找到CLSID,只能找到这个接口对应的代理/占位程序的路径或所在的类型库
      

  7.   

    CLSID
    __uuidof(Test)IID
    __uuidof(ITest)