本文是记录在实际运用中遇到的问题的解决方法,以备之后遇到同样问题有迹可循。
1、判断控件是否注册
HKEY hKey = NULL;
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, "TeeChart.TChart\\Clsid", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
{
MessageBox(_T("未注册OCX文件!"));
}
else
MessageBox(_T("已注册OCX文件!"));
其中“TeeChart.TChart”为控件的名称和内部名称,可替换为其它控件名称;控件名称可以在已注册该控件的计算机上打开注册表进行查找。
2、注册控件
BOOL CMyDlg::Loadocx()
{
HKEY hKey = NULL;
HINSTANCE hLib;
FARPROC lpDllEntryPoint;
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, "TeeChart.TChart\\Clsid", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
{
//装载ActiveX控件
hLib = LoadLibrary("D:\\TeeChart Pro v5 ActiveX Control\\teechart5.ocx"); //控件所在地址
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox(_T("不能载入OCX文件!"));
return FALSE;
}
//获取注册函数DllRegisterServer地址
lpDllEntryPoint = GetProcAddress(hLib, "DllRegisterServer");//注意这里是DllRegisterServer
//调用注册函数DllRegisterServer注册
if (lpDllEntryPoint != NULL)
{
if (FAILED((*lpDllEntryPoint)()))
{
MessageBox(_T("调用DllRegisterServer失败!"));
FreeLibrary(hLib);
return FALSE;
}
MessageBox(_T("OCX注册成功!"));
return TRUE;
}
else
{
MessageBox(_T("OCX注册失败!"));
return FALSE;
}
}
}
3、卸载控件
BOOL CMyDlg::Unloadocx()
{
HKEY hKey;
HINSTANCE hLib;
FARPROC lpDllEntryPoint;
//卸载的ocx文件
hLib = LoadLibrary("D:\\TeeChart Pro v5 ActiveX Control\\teechart5.ocx"); //要卸载的ocx文件的路径
if (hLib == NULL)
{
MessageBox("不能载入OCX文件!");
return FALSE;
}
//获取注册函数DllRegisterServer地址
lpDllEntryPoint = GetProcAddress(hLib, "DllUnregisterServer");//注意这里是DllUnregisterServer。
//调用注册函数DllRegisterServer
if (lpDllEntryPoint != NULL)
{
if (((*lpDllEntryPoint)()))
{
MessageBox("调用DllUnRegisterServer失败!");
FreeLibrary(hLib);
return FALSE;
};
MessageBox("OCX注销成功!");
return TRUE;
}
else
{
MessageBox("OCX调用DllUnRegisterServer失败!");
return FALSE;
}
}