枚举com组件类的做法

时间:2026-02-24 15:45:50

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

枚举com组件类的做法

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、编译运行该工程,结果如下:

枚举com组件类的做法

© 2026 裕芯经验网
信息来自网络 所有数据仅供参考
有疑问请联系站长 site.kefu@gmail.com