//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
我需要动态获得,也就是说,随便使用一个COM Interface,你能获取到它的CLSID吗?
因为通过接口GUID可以获得接口的指针,这种获得是
通过调用了QueryInterface得到的,接口指针是后面
才有的东西。也就说先有接口GUID才会有接口指针。
一个接口GUID可以对应对个同型接口指针。系统没有
提供任何有关接口指针到GUID的映射功能。所以编程
的时候,如果没办法拿到接口的GUID和接口的声明
是没有办法使用这个接口的。但是有种可能的方法可以
做到,那就是类型库。如果编写组件的人没有做组件的
类型库的话,那就没辙了。
exe程序#import <filename> ,就可以使用该CLSID
//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
然而想利用接口指针获得CLSID反而不方便, 不利用接口而获得CLSID上几楼兄弟已经回答了。
但是若有DLL却可以枚举~大致就是这样。貌似获取不到更详细的信息了,谢谢各位~
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();
...