新建一COM工程,新增一个接口IMyPlugin,在另外一个exe程序之中会使用到此接口,但是exe程序之中怎么获取到当前所使用的接口的CLSID?有办法获取吗?

解决方案 »

  1.   

    我可能讲的太粗略了,我的意思是,不能直接去访问那些什么IDL,或者是*.h文件。
    我需要动态获得,也就是说,随便使用一个COM Interface,你能获取到它的CLSID吗?
      

  2.   

    我似乎有点印象,好像是I...driver接口,以前我做过一个列出所有安装的com的程序,但是可能找不到代码了,你从类厂开始找,反正有driver这个东西,以前的msdn里有个例子,两年没搞,忘了。
      

  3.   

    用oleview看,能够找到对应的接口所在的组件CLSID!
      

  4.   

    没有办法在只有接口指针的情况得到得到接口的GUID,
    因为通过接口GUID可以获得接口的指针,这种获得是
    通过调用了QueryInterface得到的,接口指针是后面
    才有的东西。也就说先有接口GUID才会有接口指针。
    一个接口GUID可以对应对个同型接口指针。系统没有
    提供任何有关接口指针到GUID的映射功能。所以编程
    的时候,如果没办法拿到接口的GUID和接口的声明
    是没有办法使用这个接口的。但是有种可能的方法可以
    做到,那就是类型库。如果编写组件的人没有做组件的
    类型库的话,那就没辙了。
      

  5.   

    com工程编译成进程内组件(DLL)
    exe程序#import <filename> ,就可以使用该CLSID
      

  6.   

    但是楼主问的就是怎样获取这个CLSID,这个好像根本没办法获得吧?如果没有注解文件的话?
      

  7.   


    //Looks up a CLSID in the registry, given a ProgID.
    HRESULT CLSIDFromProgID(  LPCOLESTR lpszProgID,  LPCLSID pclsid);
    ///////////////////////////////////////////////////////
    //e.g.
    CLSIDFromProgID(L"myCo1",&clsid);//如果连com组件名myCol都不知道那就不要想了。
    //如果知道组件名也可以在注册表中查找clsid--Reference from MSDN
      

  8.   

    由接口获得CLSID最常用的方法就是你的组件实现IPersist,想实现这个接口最方便方法是使用类IPersistStreamInitImpl,可利用此接口的GetClassID得到CLSID。
    然而想利用接口指针获得CLSID反而不方便, 不利用接口而获得CLSID上几楼兄弟已经回答了。
      

  9.   

    http://support.microsoft.com/kb/286340/zh-cn这篇是从MS网站上找到的文章,是可以的,只要指定哪个DLL,通过类型库获取信息,能获取到蛮多的信息,我照着Sample Code试过,而且还能判断当前这个接口是CoClass还是Interface。
      

  10.   

    补充一下,我上面的回答有错误。不是完全正确按照我的问题,其实的确没有办法。
    但是若有DLL却可以枚举~大致就是这样。貌似获取不到更详细的信息了,谢谢各位~
      

  11.   

    hRlt = ::LoadTypeLib(L"../include/DecoderFactory.dll", &pTypeLib);
    iCount = pTypeLib->GetTypeInfoCount(); for (int i=0; i!=iCount; ++i)
    {
    hRlt = pTypeLib->GetTypeInfo(i, &pTypeInfo);
    hRlt = pTypeInfo->GetTypeAttr(&pTypeAttr);
    if (TKIND_COCLASS == pTypeAttr->typekind)
    {
    hRlt = ::ProgIDFromCLSID(pTypeAttr->guid, &pwszProgID);
    }
            }
            pTypeInfo->ReleaseTypeAttr(pTypeAttr);
    pTypeInfo->Release();
            ...