一、参考资料
二、详细介绍
1.增加管理员权限
控件注册需要管理员权限
,否则会打开DllRegisterServer失败。
2、注册控件
void CMFCApplication1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(_T("MSCOMM32\\mscomm32.ocx"));
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox(_T("不能载入OCX文件!"));
//return FALSE;
}
//获取注册函数DllRegisterServer地址
FARPROC lpDllEntryPoint;
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.注销控件
void CMFCApplication1Dlg::OnBnClickedButton2()
{
//装载ActiveX控件
HINSTANCE hLib = LoadLibrary(_T("MSCOMM32\\mscomm32.ocx"));
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
MessageBox(_T("不能载入OCX文件!"));
// return FALSE;
}
//获取注销函数DllUnregisterServer地址
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib, "DllUnregisterServer");//注意这里是DllUnregisterServer
//调用注销函数DllUnregisterServer注销
if (lpDllEntryPoint != NULL)
{
if (FAILED((*lpDllEntryPoint)()))
{
MessageBox(_T("调用DllUnregisterServer失败!"));
FreeLibrary(hLib);
//return FALSE;
}
MessageBox(_T("OCX注销成功!"));
//return TRUE;
}
else
{
MessageBox(_T("OCX注销失败!"));
//return FALSE;
}
}
4、检测控件
Mscomm控件注册后存在注册表三个地方可查
1、
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\MSCOMMLib.MSComm]
@="Microsoft Communications Control, version 6.0"
[HKEY_CLASSES_ROOT\MSCOMMLib.MSComm\CLSID]
@="{648A5600-2C6E-101B-82B6-000000000014}"
[HKEY_CLASSES_ROOT\MSCOMMLib.MSComm\CurVer]
@="MSCOMMLib.MSComm.1"
2、
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSCOMMLib.MSComm.1]
@="Microsoft Communications Control, version 6.0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSCOMMLib.MSComm.1\CLSID]
@="{648A5600-2C6E-101B-82B6-000000000014}"
3、
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}]
@="Microsoft Communications Control, version 6.0"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Control]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Implemented Categories]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Implemented Categories\{0DE86A52-2BAA-11CF-A229-00AA003D7352}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Implemented Categories\{0DE86A53-2BAA-11CF-A229-00AA003D7352}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Implemented Categories\{0DE86A57-2BAA-11CF-A229-00AA003D7352}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Implemented Categories\{40FC6ED4-2438-11CF-A3DB-080036F12502}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Implemented Categories\{40FC6ED5-2438-11CF-A3DB-080036F12502}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\InprocServer32]
@="C:\\Users\\Administrator\\Documents\\Visual Studio 2015\\Projects\\MFCApplication1\\Debug\\MSCOMM32\\mscomm32.ocx"
"ThreadingModel"="Apartment"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\MiscStatus]
@="0"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\MiscStatus\1]
@="132497"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\ProgID]
@="MSCOMMLib.MSComm.1"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Programmable]
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\ToolboxBitmap32]
@="C:\\Users\\Administrator\\Documents\\Visual Studio 2015\\Projects\\MFCApplication1\\Debug\\MSCOMM32\\mscomm32.ocx, 1"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\TypeLib]
@="{648A5603-2C6E-101B-82B6-000000000014}"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\Version]
@="1.1"
[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{648A5600-2C6E-101B-82B6-000000000014}\VersionIndependentProgID]
@="MSCOMMLib.MSComm"
所以检测控件通过检查注册表来确定
void CMFCApplication1Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
HKEY hKey;
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("MSCOMMLib.MSComm\\CLSID"), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
//if (RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("Wow6432Node\\CLSID\\{648A5600-2C6E-101B-82B6-000000000014}\\InprocServer32"), 0, KEY_READ, &hKey) != ERROR_SUCCESS)
{
MessageBox(_T("OCX没有注册!!!"));
// return FALSE;
}
else
{
MessageBox(_T("OCX已经注册!!!"));
// return TRUE;
}
}
三、案例下载
这里介绍的是在当前目录下进行的注册,如果0cx文件目录改变,控件注册就失效了,应该把文件复制到c:\widnows\system32下面去注册