一、参考资料
二、详细介绍
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下面去注册
扫描二维码关注公众号,回复:
1703058 查看本文章