VC如何自动注册MSCHRT20.OCX控件

MSCHRT20.OCX控件是重要的绘制图表的ActiveX控件,在VC得到广泛的运用。但是,此控件不是Windows系统默认注册的,如果不经过注册,采用此控件的程序将无法运行。故我们开发的程序,必须要检测运行此程序的电脑是否已注册MSCHRT20.OCX控件,如果没有注册,程序必须能够自动注册此控件。

下面是自动注册的代码,没时间解释,见谅。
//===================================================================================

//

//检测是否已注册MSCHRT20.OCX控件

//如何没有,将存放在当前目录下的MSCHRT20.OCX控件复制到系统目录下的System32,调用OnRegisterReg()函数注册

//

//===================================================================================

LRESULT CConfigDlg::OnShowChart(WPARAM wparam,LPARAM lparam)

{

     if(!OnIsRegistOCX())

     {

         TCHAR Path[MAX_PATH+1];      

        

         //CSIDL_SYSTEM:GetSystemDirectory(); CSIDL_WINDOWS:GetWindowsDirectory()  

         HRESULT hr= SHGetSpecialFolderPath(NULL, Path, CSIDL_SYSTEM, FALSE); 

         CString url = Path;

 

         ::CopyFileA(strCurrentDir + "\\res\\MSCHRT20.OCX", url + "\\MSCHRT20.OCX",true);

         OnRegisterReg();

 

     }

     CChartDlg *pDlg = new CChartDlg;

     pDlg->DoModal();

     return 1;

}

//===================================================================================

//

//注册MSCHRT20.OCX控件

//

//===================================================================================

boolCConfigDlg::OnRegisterReg(void)

{

     LPCTSTR   pszDllName= "MSCHRT20.OCX ";

     //装载ActiveX控件

     HINSTANCE   hLib   =   LoadLibrary(pszDllName);

     if   (hLib   <   (HINSTANCE)HINSTANCE_ERROR)

     {

         MessageBox( "MSCHRT20.OCX file could not be loaded! ", "Result ",MB_OK);

         return 0;

     }

     //获取注册函数DllRegisterServer地址

     FARPROC   lpDllEntryPoint;  

     lpDllEntryPoint   =   GetProcAddress(hLib,_T("DllRegisterServer"));

     //调用注册函数DllRegisterServer

     if(lpDllEntryPoint!=NULL)

     {

         if(FAILED((*lpDllEntryPoint)()))

         {

              MessageBox( "Call to DllRegisterServer failed!", "Result ",MB_OK);

                   FreeLibrary(hLib);

              return 1;

         };

     //   MessageBox( "注册成功", "结果",MB_OK);

     }

     else

         MessageBox( "Failed to regist MSCHRT20.OCX ! "     , "Result ",MB_OK);

}

//手动注销OCX控件Regsvr32 /u mschrt20.ocx

 

//===================================================================================

//

//检测是否已注册MSCHRT20.OCX控件,控件的CLSID:A2B370C-BA0A-11D1-B137-0000F8753F5D

//

//===================================================================================

boolCConfigDlg::OnIsRegistOCX(void)

{

 

     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\\{3A2B370C-BA0A-11D1-B137-0000F8753F5D}\\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;  

 

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值