By SmartPtr(http://www.shnenglu.com/SmartPtr/)
同事工作中遇到這個(gè)問(wèn)題,不想在創(chuàng)建對(duì)象失敗時(shí)才知道原來(lái)對(duì)應(yīng)的COM對(duì)象不可用。自己項(xiàng)目中用到了這個(gè),遂總結(jié)一下,希望對(duì)大家有用。
要判斷一個(gè)COM對(duì)象是否有用,首先要判斷該COM對(duì)象的CLSID是否在注冊(cè)表中注冊(cè),但注冊(cè)了并不能保證其可用,因?yàn)槿绻艺`刪了該COM對(duì)象的載體-DLL(或exe),該COM對(duì)象仍然不能正確創(chuàng)建。所以我們還要判斷該載體文件是否存在,兩者都通過(guò)了,該COM對(duì)象才可正確創(chuàng)建。
直接看代碼:
bool IsCOMAvailable(CString strGUID)
{
// 1. Try to open the HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} key
CString strKeyName = _T("CLSID\\") + strGUID;
HKEY hClsidKey;
if( ::RegOpenKeyEx( HKEY_CLASSES_ROOT, strKeyName, 0, KEY_QUERY_VALUE, &hClsidKey ) == ERROR_SUCCESS )
{
// 2. Continue to open CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InProcServer32\(Default)
HKEY hInProcServer32Key;
if( ::RegOpenKeyEx( hClsidKey, _T( "InProcServer32" ), 0, KEY_QUERY_VALUE, &hInProcServer32Key ) == ERROR_SUCCESS )
{
TCHAR tszServerPathName[_MAX_PATH];
DWORD dwSize = sizeof( tszServerPathName );
DWORD dwType;
// 3. Get the com dll path
if( ::RegQueryValueEx( hInProcServer32Key, NULL, NULL, &dwType, (LPBYTE)tszServerPathName, &dwSize ) == ERROR_SUCCESS )
{
if( dwType != REG_SZ )
return false;
// 4. If the dll file exist
CFileFind fileFind;
if(fileFind.FindFile(tszServerPathName))
return true;
}
::CloseHandle(hInProcServer32Key);
}
::CloseHandle(hClsidKey);
}
return false;
}
posted on 2007-07-06 21:30
SmartPtr 閱讀(1812)
評(píng)論(7) 編輯 收藏 引用