【小沐学C++】C++ MFC中嵌入64位ActiveX控件(VS2017)

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。

https://blogs.windows.com/msedgedev/2015/05/06/a-break-from-the-past-part-2-saying-goodbye-to-activex-vbscript-attachevent/

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 添加控件

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

为解决32位IDE中无法找到x64 ActiveX控件的问题,仍采用事先创建并注册好的FxActiveX_MfcListCtrl(ActiveX控件)做测试,不同的是其配置为x64。

添加方法与32位控件不同(当然也可以先注册对应的32位控件,添加控件代码之后,再注册64位控件,再编译代码工程),这里采用动态创建控件的方式,成功解决无法添加的问题。

  • (1)新建基于对话框的工程。
    在这里插入图片描述
  • (2)鼠标右键弹出菜单“类向导”
    在这里插入图片描述
  • (3)在窗口“类向导”,点击下拉框“添加类”,选择菜单“ActiveX控件中的MFC类”。

在这里插入图片描述

  • (4)在可用的ActiveX控件里没有找到相关控件FxActiveX_MfcListCtrl(ActiveX控件)的信息。
    如果是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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

猜你喜欢

转载自blog.csdn.net/hhy321/article/details/133198491