1、简介
1.1 MFC
Microsoft 基础类 (MFC) 库针对大部分 Win32 和 COM API 提供面向对象的包装器。 虽然此包装器可用于创建极为简单的桌面应用程序,但当你需要开发具有多个控件的更复杂的用户界面时,此包装器将最为有用。 可以使用 MFC 创建带有 Office 样式用户界面的应用程序。
https://learn.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?view=msvc-170
用于多字节字符编码 (MBCS) 的 MFC 库 (DLL) 不再包含于 Visual Studio 中,但可用作 Visual Studio 加载项。
- 下图表示派生自 CObject 的 MFC 类:
- 下图表示派生自 CWnd 和 CCmdTarget 的 MFC 类:
- 下图表示不是从 CObject 派生的 MFC 类:
1.2 ActiveX
ActiveX 控件是一种特定的自动化服务器类型;它是可重用组件。 托管 ActiveX 控件的应用程序是该控件的自动化客户端。在 Visual C++ 中,您可以使用 MFC 或 ATL 创建 ActiveX 控件。
-
ActiveX 控件容器与有窗口的 ActiveX 控件之间的交互
-
ActiveX 控件容器与 ActiveX 控件之间的通信
-
有窗口的 ActiveX 控件中的 Windows 消息处理(活动时)
ActiveX 是旧技术,不应用于新开发。 可以使用 HTML5 和 JavaScript、新式浏览器扩展或 WebAssembly 模块等现代技术,以更简单、更安全的方式执行 ActiveX 控件的许多功能。有关详细信息,请参阅告别过去(第 2 部分):告别 ActiveX、VBScript、attachEvent 和本机消息以及 Microsoft Edge 扩展和 WebAssembly。
2、使用ActiveX控件
2.1 注册控件
- 命令行注册
Regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行。 regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname 其中dllname为activex控件文件名,建议在安装前拷贝到system文件夹下。
Regsvr32 [/u] [/n] [/i[:cmdline]] <dllname>
%systemroot%\SysWoW64\regsvr32 <full path of the DLL>
参数解释如下:
/u #反注册控件,取消注册服务器
/s #指定 regsvr32 安静运行,在成功注册/反注册DLL文件的前提下不显示结果提示框。
/n #不调用 DllRegisterServer;此选项必须与 /i 一起使用
/i:cmdline #调用 DllInstall,为其传递一个可选 [cmdline];当与 /u 一起使用时,可调用 dll uninstall
dllname #指定要注册的 dll 文件名。
# 已管理员权限运行命令行窗口执行如下注册命令
regsvr32 FxActiveX_MfcListCtrl.ocx
# 取消注册
regsvr32 /u FxActiveX_MfcListCtrl.ocx
- C++代码注册 如果愿意,可以编写C++代码安装程序来直接注册控件。 使用 LoadLibrary Windows API 加载控件 DLL。 接下来,使用 GetProcAddress 获取“DllRegisterServer”函数的地址。 最后,调用 DllRegisterServer 函数。 以下代码示例演示了一种可能的方法,其中 hLib 存储控件库的句柄,而 lpDllEntryPoint 存储“DllRegisterServer”函数的地址。
HINSTANCE hLib = LoadLibrary(pszDllName);
if (hLib < (HINSTANCE)HINSTANCE_ERROR)
{
AfxMessageBox(IDS_LOADLIBFAILED); //unable to load DLL
iReturn = FAIL_LOAD; //unable to load DLL
}
// Find the entry point.
lpDllEntryPoint = GetProcAddress(hLib, "DllRegisterServer");
if (lpDllEntryPoint != NULL)
(*lpDllEntryPoint)();
else
;// Unable to locate entry point
在安装程序安装 ActiveX 控件之前,应调用 OleInitialize。 安装程序完成后,调用 OleUnitialize。 这可确保 OLE 系统 DLL 处于注册 ActiveX 控件的正确状态。
2.2 添加控件
<font color=red>QA: MFC dialog web browser activeX Control will not generate class correctly. https://developercommunity.visualstudio.com/t/mfc-dialog-web-browser-activex-control-will-not-ge/499195
<font color=red>为解决32位IDE中无法找到x64 ActiveX控件的问题,仍采用事先创建并注册好的FxActiveX_MfcListCtrl(ActiveX控件)做测试,不同的是其配置为x64。
<font color=green>添加方法与32位控件不同(当然也可以先注册对应的32位控件,添加控件代码之后,再注册64位控件,再编译代码工程),这里采用动态创建控件的方式,成功解决无法添加的问题。
- (1)新建基于对话框的工程。
- (2)鼠标右键弹出菜单“类向导”
- (3)在窗口“类向导”,点击下拉框“添加类”,选择菜单“ActiveX控件中的MFC类”。
- (4)在可用的ActiveX控件里没有找到相关控件FxActiveX_MfcListCtrl(ActiveX控件)的信息。 <font color=blue>如果是32位控件注册的话,是可以看见的。
- (5)选择从文件直接加载。
- (6)导出文件里的控件类。
- (7)自动生成对应的控件类代码文件。
- (8)添加控件对象定义代码。
#include "CDXlist0.h"
CDXlist0 m_ctl;
- (9)添加控件对象实现代码。
#define IDC_OCX_CTL 1000
CRect rect;
GetClientRect(&rect);
m_ctl.Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, IDC_OCX_CTL);
m_ctl.ShowWindow(SW_SHOW);
for (int i = 0; i < 100; i++) {
CString strText;
strText.Format(L"hello: %d", i);
m_ctl.AddTextItem(0, strText);
}
- (10)编译和运行工程。 成功加载ActiveX控件!
- 总结
- (1)注册表方式添加:需要先注册对应的32位控件。再通过注册表的下拉框选择对应控件项生成控件类。
- (2)文件方式添加:如果没有对应32位控件,则先注册对应64位控件,再通过文件方式添加64位控件文件生成控件类。
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!