1、1.新建一个Win32控制台工程EnumComClass,如下图:

2、输入下面的C++代码:
#include <string>
#include <vector>
#include <stdexcept>
ITypeLib *pTypeLib = NULL;
ITypeInfo *pTypeInfo = NULL;
void Cleanup();
GUID getCLSIDFromFile(const std::wstring& strFileName)throw(std::runtime_error);
//strFileName--输入tlb,ocx文件路径
bool getCLSIDFromFile(const std::wstring& strFileName,std::vector<GUID>& vecID)
throw(std::runtime_error)
{
_bstr_t str;
HRESULT hr;
TCHAR* pwszProgID = NULL;
hr = LoadTypeLib(strFileName.c_str(), &pTypeLib);//加载类型库信息
if (FAILED(hr))
{
Cleanup();
return false;
}
TYPEATTR* pTypeAttr = NULL;
UINT iCount = pTypeLib->GetTypeInfoCount(); //获取类型数量
for (int i = 0; i < iCount; i++)
{
if (FAILED(hr = (pTypeLib->GetTypeInfo(i, &pTypeInfo))))//获取类型说明信息
{
Cleanup();
// throw runtime_error("输入文件不包含相关com组件接口");
return false;
}
if (FAILED(hr = (pTypeInfo->GetTypeAttr(&pTypeAttr))))//获取类型属性
{
Cleanup();
// throw runtime_error("输入文件不包含相关com组件接口");
return false;
}
//if (TKIND_DISPATCH == pTypeAttr->typekind)//判断是否为组件接口
// return pTypeAttr->guid;
if (TKIND_COCLASS == pTypeAttr->typekind)//判断是否为组件接口
vecID.push_back(pTypeAttr->guid);
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
pTypeInfo->Release();
}
if (pTypeAttr)
{
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
pTypeAttr = NULL;
}
pTypeLib->Release();
pTypeLib = NULL;
if (!vecID.empty())
return true;
else return false;
}
void Cleanup()
{
if (pTypeInfo)
pTypeInfo->Release();
pTypeInfo = NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 这里以获取ado组件中的接口类为例
const std::wstring strFileName = _T("c:\\program files\\common files\\system\\ado\\msado15.dll");
std::vector<GUID> vecID;
if (!getCLSIDFromFile(strFileName, vecID))
return 1;
WCHAR *pBuf = new WCHAR[48]; //很配存储文字串的空间
for (int i = 0; i < vecID.size();i++)
{
memset(pBuf, 0, 48 * sizeof(WCHAR));
::StringFromGUID2(vecID[i], pBuf, 48);
wprintf(_T("%s\n"), pBuf);
}
delete[]pBuf;
getchar();
return 0;
}
3、编译运行该工程,结果如下:
