资源大全 | 神秘文化 | 在线翻译 | QQ专区 | 视频教程 | 彩信频道 | 搜索引擎 | BT下载 |  | 网站地图
设为首页
加入收藏
联系站长
您现在的位置: 一百网络 >> 其他编程 >> C++编程 >> 文档正文
最近更新
普通文档 mutable的用法
普通文档 stringstream的用法
普通文档 explicit的用法
普通文档 VHDL语言数字钟
普通文档 自定义Firefox的配置保存
普通文档 subversion服务器的配置
普通文档 一段代码的几种写法-怎么
普通文档 如何判断一个COM对象是否
普通文档 纯技术讨论com控件创建过
普通文档 string 类的使用方法
推荐文章
推荐文档 专家教您如何在C语言中巧
推荐文档 详细解析C++编写的ATM自
推荐文档 C++编程中的四个调试小技
推荐文档 Windows下C语言网络编程
推荐文档 Visual C++常用数据类型
推荐文档 COM组件设计与应用之实现
推荐文档 利用VC实现图像的特殊显
如何判断一个COM对象是否可用

文章作者:未知 录入时间:2007-7-10 来源:本站原创
网站声明:本站的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出处和原始作者,文章版权归本网站与文章作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。

同事工作中遇到这个问题,不想在创建对象失败时才知道原来对应的COM对象不可用。自己项目中用到了这个,遂总结一下,希望对大家有用。
  要判断一个COM对象是否有用,首先要判断该COM对象的CLSID是否在注册表中注册,但注册了并不能保证其可用,因为如果我误删了该COM对象的载体-DLL(或exe),该COM对象仍然不能正确创建。所以我们还要判断该载体文件是否存在,两者都通过了,该COM对象才可正确创建。
   直接看代码:
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;
  • 上一篇文档:

  • 下一篇文档:
  •     查找更多“如何判断一个COM对象是否可用”的内容  
    相关连接
  • mutable的用法

  • stringstream的用法

  • explicit的用法

  • VHDL语言数字钟

  • 自定义Firefox的配置保存路径