gpt4 book ai didi

c++ - 要在 Excel 工作表上直接使用 ActiveX 控件,有哪些必要和充分的要求?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:34 25 4
gpt4 key购买 nike

Microsoft Office 支持文章“Add or register an ActiveX control”说:

IMPORTANT: Not all ActiveX controls can be used directly on worksheets; some can be used only on Microsoft Visual Basic for Applications (VBA) UserForms. When you work with these controls, Excel displays the message Cannot insert object if you try to add them to a worksheet.

但是,我无法在任何地方找到有关直接在工作表上使用控件的必要充分要求的记录。

我创建了一个新的 C++/ATL 项目,并向其中添加了一个 ATL 控件,并始终接受默认设置。编译、构建和注册控件后,它出现在 Excel 的“更多控件”列表中(在“开发人员”>“插入”>“ActiveX 控件”>“更多控件...”下访问)但是在尝试插入工作表时会看到此“无法插入对象"错误。

我必须进行哪些更改才能解决此问题?

Excel 对 ActiveX 控件的要求记录在哪里?


就其值(value)而言,我已经验证向导生成的控件在其他方面可以正常工作(使用我从 ActiveX Control Test Container 构建的 Visual C++ 2008 samples pack 进行测试)。

此外,我知道 documentation for the ATL Control wizard's "Appearance" tab如下描述“可插入”复选框:

Select this option to have your control appear in the Insert Object dialog box of applications such as Word and Excel. Your control can then be inserted by any application that supports embedded objects through this dialog box.

但是,这个复选框(它只是将“Insertable”子项添加到注册表)只会导致控件出现在“插入”>“文本”>“对象”对话框中——为避免疑义,我已经尝试过使用和不使用它检查并以任何一种方式产生相同的错误。

我目前正在比较尝试插入我的控件时 Excel 的执行路径与尝试插入工作 (Forms 2.0) 控件时的执行路径。关键区别似乎在于加载类型库时的 VBE7.dll(OLE/COM Object Viewer 能够从我的 DLL 中正确加载它——但在 Excel 从中执行所有相同的读取之后,它在写出 EXD 之前中止)。 ..我现在正在研究一些程序集,徒劳地希望我能弄明白——但肯定某人已经为 Excel 构建了一个工作控件并且知道我缺少什么可以节省我这么痛?!


<支持>Microsoft Windows 10 专业版 v1511 (10.0.10586.164) 64 位
Microsoft Excel 2016 MSO (16.0.4312.1000) 64 位
Microsoft Visual Studio 社区 2015(14.0.24720.00 更新 1)

最佳答案

要实现可插入 MS Excel 工作表的 ATL ActiveX 控件,请执行以下步骤:

  1. 确保您没有在 C:\Users\$(UserName)\AppData\Local\Temp\Excel8.0 中缓存 ActiveX 控件信息 *.exd 文件,这可能是一个不明显的障碍

  2. 使用所有默认值创建一个 ATL DLL 项目

2.1。添加 x64 配置作为现有 Win32 的拷贝 - 对于 64 位 Excel,您将需要 64 位 ActiveX 控件

  1. 使用向导添加 ATL 控件类

enter image description here

3.1。确保填写 ProgID 字段

enter image description here

3.2。在Interfaces页面添加IPersistStreamInit

enter image description here

  1. 构建 DLL 并注册它 (regsvr32)

  2. 在 Excel 中,新控件在菜单开发人员、...、更多控件中可见

enter image description here

enter image description here

  1. 插入它并从那里获得乐趣

enter image description here

源代码:Subversion/Trac

更新:来自以下评论的问题:

...whether Excel supports windowless activation?

要查看实际的控制操作,让我们添加一些代码 around there :

CSample()
{
CTrace::SetLevel(4);

HRESULT OnDraw(ATL_DRAWINFO& di)
{
const CComQIPtr<IOleInPlaceSiteWindowless> pOleInPlaceSiteWindowless = m_spClientSite;
ATLTRACE(_T("m_spClientSite 0x%p, pOleInPlaceSiteWindowless 0x%p, m_hWnd 0x%08X\n"), m_spClientSite, pOleInPlaceSiteWindowless, m_hWnd);

这将打印出有助于识别窗口/无窗口模式的控件成员。输出是(最终在激活对象之后或从一开始就开始):

...
Sample.h(118) : atlTraceGeneral - m_spClientSite 0x0000027A9CA7B460, pOleInPlaceSiteWindowless 0x0000000000000000, m_hWnd 0x0105069C
...
Sample.h(118) : atlTraceGeneral - m_spClientSite 0x0000027A9CA7B460, pOleInPlaceSiteWindowless 0x0000000000000000, m_hWnd 0x0105069C

该控件可以同时激活有窗口和无窗口(除非 m_bWindowOnly 设置为 true,在这种情况下强制窗口模式)。跟踪显示控件处于窗口模式,并且该容器没有 IOleInPlaceSiteWindowless,这对于无窗口是必需的。

关于c++ - 要在 Excel 工作表上直接使用 ActiveX 控件,有哪些必要和充分的要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com