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;
}