210上位机VC MFC实现COM控件OCX的注册与制裁
210上位机VC MFC实现COM控件OCX的注册与制裁
功能展示
OCX控件是很常用的一种插件,比如优酷都有对外提供OCX控件,但使用OCX控件得注册才能使用,OCX控件可以用鼠标手动注册也可以用代码实现自动注册,我们当前例程实现了OCX或DLL的注册功能,选择要注册的COM控件后,就可进行COM控件的注册与卸载,效果如图; 要点提示 首先OCX控件得调用函数LoadLibrary()进行加载到程序中,然后才能够动态获取控件内DllRegisterServer()与DllUnregisterServer()函数进行控件的注册与卸载; 一.LoadLibrary 函数原型:HMODULE WINAPI LoadLibrary( _In_LPCTSTR lpFileName); 返回值及参数 说明: 返回为Long类型,成功则返回库模块的句柄,零表示失败。调用函数GetLastError()获取具体错误代码; lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序,一旦不需要,用FreeLibrary函数释放DLL; 二.函数DllRegisterServer()DllUnregisterServer()指针的动态获取可以用函数GetProcAddress()实现; GetProcAddress函数原型: FARPROC GetProcAddress(HMODULE hModule, LPCSTRlpProcName ); 参数含义: hModule [in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary 或者GetModuleHandle函数可以返回此句柄。 lpProcName [in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。 如果函数调用成功,返回值是DLL中的输出函数地址。如果函数调用失败,返回值是NULL。可以调用函数GetLastError()获得具体错误代码;
实现功能 1.新建基于对话框的应用程序
2.拖拽一编辑框ID为IDC_EDIT1用于显示要注册的OCX控件,拖拽三个按钮控件<选择要注册的COM控件><注册选择的COM控件><制裁选择的COM控件><卸载选择的COM控件>关联函数,三个函数体为: - void CGkbc8Dlg::OnRegister()
- {
- CString sText;
- GetDlgItemText(IDC_EDIT1,sText);
- if(sText.IsEmpty())//没有选择 OCX返回
- return;
- HMODULE hModule=::LoadLibrary(sText);
- if(hModule == NULL)
- {
- MessageBox("加载ocx控件失败");
- return;
- }
- typedef int ( __stdcall *pFunDllRegisterOCX)(void);
- pFunDllRegisterOCX DllRegisterServer = (pFunDllRegisterOCX)GetProcAddress(hModule,"DllRegisterServer");
- if(DllRegisterServer != NULL)
- {
- HRESULT hResult = DllRegisterServer();
- if(hResult == S_OK)
- MessageBox("ocx控件注册成功");
- else
- MessageBox("ocx控件注册失败");
- }
- FreeLibrary(hModule);
- }
复制代码- void CGkbc8Dlg::OnChoose()
- {
- CFileDialog Dlg(TRUE,".OCX",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"ocx控件(.ocx)|*.ocx;*.dll||");
- if(Dlg.DoModal() == IDOK)
- SetDlgItemText(IDC_EDIT1,Dlg.GetPathName());
- }
- void CGkbc8Dlg::OnUnregister()
- {
- CString sText;
- GetDlgItemText(IDC_EDIT1,sText);
- if(sText.IsEmpty())//没有选择 OCX返回
- return;
- HMODULE hModule=::LoadLibrary(sText);
- if(hModule == NULL)
- {
- MessageBox("加载ocx控件失败");
- return;
- }
- //<>
- typedef int ( __stdcall *pFunDllUnregisterOCX)(void);
- pFunDllUnregisterOCX DllUnregisterServer = (pFunDllUnregisterOCX)GetProcAddress(hModule,"DllUnregisterServer");
- if(DllUnregisterServer != NULL)
- {
- HRESULT hResult = DllUnregisterServer();
- if(hResult == S_OK)
- MessageBox("ocx控件卸载成功");
- else
- MessageBox("ocx控件卸载失败");
- }
- FreeLibrary(hModule);
- }
复制代码要注意的是OCX控件注册在WIN7得获得管理员权限才能成功,权限的具体获得方法视频演示会介绍;
|