工控编程吧
标题:
210上位机VC MFC实现COM控件OCX的注册与制裁
[打印本页]
作者:
qq263946146
时间:
2016-1-31 22:02
标题:
210上位机VC MFC实现COM控件OCX的注册与制裁
(, 下载次数: 1)
上传
点击文件名下载附件
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得获得管理员权限才能成功,权限的具体获得方法视频演示会介绍;
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4