小弟要判断一个ocx是否已注册,不知道代码如何写。
望各位高手指点迷津。

解决方案 »

  1.   

    在那里判断? 是这个OCX本身判断 还是在其他的控件或应用程序里面判断?例如你要检查的控件是CMMX控件。最笨的方法就是不管是在那里 直接定义一个OCX控件的指针:CMMX* MMX;
    然后在你的程序OnCreat的时候 生成这个控件int m = MMX.Creat(); 增加判断 
    if(m == 0)
    {
        //控件没有注册,至少是没有办法正常使用
    }else{
        //控件注册成功,至少可以创建这个控件,而且能够创建成功。
    }
      

  2.   

    用CoCreateInstance试试, 如果创建不成功, 表示注册失败.
      

  3.   

    如果知道CLSID或者PROGID,可以直接查注册表
      

  4.   


    HKEY_CLASSES_ROOT\CLSID\组件的CLSID
    HKEY_CLASSES_ROOT\组件的PROGID
      

  5.   

    把下面的   CLASSID   换成你的   OCX   控件的就可以了:   
        
      BOOL   CYourApp::IsInstalled()   
      {   
      HKEY hKey;   
      BOOL bPresent;   
      TCHAR szPath[_MAX_PATH];   
      DWORD dwRegType;   
      DWORD cbData   =   sizeof   szPath   *   sizeof   TCHAR;   
        
      hKey   =   NULL;   
      bPresent   =   FALSE;   
      ::RegOpenKey(HKEY_CLASSES_ROOT,   _T("CLSID\\{D27CDB6E-AE6D-11cf-96B8-444553540000}\\InprocServer32"),   &hKey);   
      if(hKey)     
      {   
      HANDLE hfile;   
        
      szPath[0]   =   0;   
      ::RegQueryValueEx(hKey,   NULL,   NULL,   &dwRegType,   (LPBYTE)szPath,   &cbData);   
      ::RegCloseKey(hKey);   
        
      hfile   =   ::CreateFile(szPath,   0,   FILE_SHARE_READ   |   FILE_SHARE_WRITE,   NULL,   OPEN_EXISTING,   0,   NULL);   
      if(INVALID_HANDLE_VALUE   !=   hfile)   
      {   
      bPresent   =   TRUE;   
      ::CloseHandle(hfile);   
      }   
      }   
        
      return   bPresent;   
      }   以前的代码,拷贝给你。
      

  6.   

    个人的建议是分两种情况处理,如果是已知OCX,则从OCX当中取出其ProgID来判断,如果是程序当中需要使用,即已知ProgID,则直接判断。