直接在 Excel 工作表上使用 ActiveX 控件的必要和充分要求是什么?

2024-01-12

Microsoft Office 支持文章“添加或注册 ActiveX 控件 https://support.office.com/en-us/article/Add-or-register-an-ActiveX-control-8fc743a1-e72b-4b55-af3a-85d326e53918?CorrelationId=4bb9e069-dfb2-4d54-9177-20c30bfd628e" says:

重要的:并非所有 ActiveX 控件都可以直接在工作表上使用;有些只能在 Microsoft Visual Basic for Applications (VBA) 用户窗体上使用。当您使用这些控件时,Excel 会显示消息无法插入对象如果您尝试将它们添加到工作表中。

但是,我在任何地方都找不到记录的要求必要的 and 充足的用于直接在工作表上使用的控件。

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

我必须做出哪些改变才能解决这个问题?

OR

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


对于它的价值,我已经验证了向导生成的控件确实可以正常工作(使用ActiveX 控件测试容器 https://msdn.microsoft.com/en-us/library/ms241446(v=vs.80).aspx,我从Visual C++ 2008 示例包 https://www.microsoft.com/en-us/download/details.aspx?id=16351).

此外,我知道ATL 控制向导的“外观”选项卡的文档 https://msdn.microsoft.com/en-us/library/szk0aba5.aspx“可插入”复选框的描述如下:

选择此选项可使您的控件出现在 Word 和 Excel 等应用程序的“插入对象”对话框中。然后,任何支持嵌入对象的应用程序都可以通过此对话框插入您的控件。

然而,这个复选框(它只是将“Insertable”子项添加到注册表中)只会导致该控件出现在“插入”>“文本”>“对象”对话框中,为了避免疑问,我尝试了选中和不选中此复选框的情况,并且无论哪种方式都会产生相同的错误。

我目前正在将尝试插入我的控件时的 Excel 执行路径痕迹与尝试插入工作(Forms 2.0)控件时的 Excel 执行路径痕迹进行比较。主要区别似乎在于加载类型库时的 VBE7.dll(其中OLE/COM 对象查看器 https://msdn.microsoft.com/en-us/library/d0kh9f4c.aspx能够从我的 DLL 中正确加载,但是在 Excel 从中执行所有相同的读取之后,它在写出 EXD 之前中止)...我现在正在挖掘一些程序集,徒劳地希望我能弄清楚它出去——但肯定是someone谁已经为 Excel 构建了一个工作控件并且知道我缺少什么可以让我免受这种痛苦?!


Microsoft Windows 10 Pro v1511 (10.0.10586.164) 64-bit
Microsoft Excel 2016 MSO (16.0.4312.1000) 64-bit
Microsoft Visual Studio Community 2015 (14.0.24720.00 Update 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 Control 类

3.1.确保填写 ProgID 字段

3.2.在 Interfaces 页面添加 IPersistStreamInit

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

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

  1. 插入它并从中享受乐趣

源代码:颠覆 http://www.alax.info/svn/public/trunk/Utilities/Miscellaneous/ExcelControl//Trac http://www.alax.info/trac/public/browser/trunk/Utilities/Miscellaneous/ExcelControl

UPDATE: 下面评论中的一个问题:

...Excel是否支持无窗口激活?

要查看实际的控制操作,我们添加一些代码在那儿附近 http://www.alax.info/trac/public/browser/trunk/Utilities/Miscellaneous/ExcelControl/Sample.h#L37:

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

and

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,对于无窗来说这是强制性的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

直接在 Excel 工作表上使用 ActiveX 控件的必要和充分要求是什么? 的相关文章

  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 如何指定自定义 libc++

    我已经构建了 libc 并且想在编译程序时使用它 所以我有类似的东西 clang stdlib libc libc so main cpp 但这不起作用 在构建应用程序时如何使用我的自定义构建的 libc 此信息来自关于 libcxx 的
  • iPhone TCP 连接

    我想在iPhone和PC之间建立tcp连接 在 PC 上 QTspServer 正在运行并工作 已与其他客户端应用程序进行测试 这是我在 iPhone 上使用的连接方法 IBAction connectToServer id sender
  • 为什么没有像 MSG_WAITALL 这样的标志用于发送?

    旗帜MSG WAITALL可用于recv 这要求recv阻塞直到满足完整的请求 这意味着recv直到达到请求的数据量 由参数指定 才会返回len 已收到 除非发生错误或连接已关闭 为什么这样的标志不适用于send也 我认为这对于发送非常有用
  • 最好的基于 jquery 的灯箱/弹出对话框?

    我正在寻找一个基于 jquery 的弹出对话框 我们将使用它 显示静态内容页面 使用条款等 联系我们页面 已经使用 jquery 表单插件进行 ajax 提交 显示全尺寸的照片缩略图 有人可以推荐一款可以满足上述所有要求并且相当轻量级且易于
  • 如何确定 EventLog 是否已存在

    我正在使用以下行创建新的事件日志 new eventlog LogName Visual Studio Builds Source Visual Studio 我想每次都运行它 因为如果我从新计算机运行构建 我仍然希望查看事件日志 问题是
  • asp.net webforms ajax 更新 gridview

    我们有一个包含大量信息 100 行或行和列 的网格视图 我们需要提高其性能 目前 为了解决一些性能问题 我们使 gridview 没有编辑模板 而是双击一个单元格将弹出一个可用选项的下拉列表 该选项是使用 webmethods 检索并使用
  • jekyll:检查是否没有帖子

    如何查看帖子里是否没有帖子 posts folder 到目前为止 我已经尝试过 if site posts null p No posts yet p endif and if site posts nil p No posts yet p
  • 从 VB 转换为 C#

    我的任务是将解决方案从 VB 转换为 C 有 22 个项目和数百个类 所以我决定研究转换器 我最终选择了 SharpDevelop 这是一个带有转换器的 IDE 我在每个项目上都运行了它 并且有很多错误需要修复 但我应该能够检查它们并希望找
  • Sequelize 增量函数返回错误

    尝试增加我的数据库中模型实例的整数字段 这是相关代码 models Options findAll where PollId poll id name option to update then option gt option incre
  • 删除网址中的主题标签,刷新 f5 时出错(angularJs-cordova)

    我对 AngularJs 中的路由器有一些疑问 我使用了 Angular UI Router 但是当使用 locationProvider 删除 url 中的主题标签 时出现错误 如何解决这个问题 在我的模块中 config functio
  • 使用 JNI 从 C++ 调用 JAVA 方法,无参数

    请耐心听我说 我是一名 iPhone 开发人员 而整个 Android 这让我有点困惑 我有一些从 cocos2d x CCMenuItem 调用的 C 方法 因此 根据文档 我无法发送任何参数 我需要使用 android 浏览器打开一个
  • CSS 箭头在 jQuery SlideUp 或 SlideDown 动画期间隐藏

    我有一个使用 CSS 创建的顶部带有箭头的 div arrow box position relative display none background 88b7d5 border 4px solid c2e1f5 padding 20p
  • 在 ExtJS 中,如何循环菜单项?

    如何循环遍历 ExtJS 工具栏菜单中的所有项目 例如更改其图标 使用 each 方法混合系列 http dev sencha com deploy dev docs class Ext util MixedCollection按钮菜单中的
  • 为什么 XmlDocument.LoadXml 抛出 System.Net.WebException?

    为什么System Xml XmlDocument LoadXml方法抛出System Net WebException 这真是令人难以置信的疯狂 如果MSDN http msdn microsoft com en us library s
  • python 中的专用 @property 装饰器

    我有几个类 每个类都有许多属性 所有属性的共同点是它们应该是数字属性 这似乎是使用 python 装饰器的理想场所 但我似乎无法完全理解正确的实现是什么 这是一个简单的例子 class Junk object def init self v
  • 在 VSCode 中包含 d.ts 类型定义文件

    我已经开始使用 VSCode 0 7 0 并注意到注释说你不必添加 不再参考 引入 jsconfig json 后 您不再需要在每个文件中使用 引用 这些在 VS Code 的初始版本中是必需的 由于文件集是在 jsconfig json
  • python Anaconda 中的 Mayavi

    我安装了mayavi在 Anaconda 中使用命令 conda exe install mayavi 在 Anaconda 命令提示符中 现在 当我关闭 Spyder 时 它就不再打开了 我该如何解决 我正在使用Windows 我想展示我
  • 如何避免Python API服务器中的重复处理? [复制]

    这个问题在这里已经有答案了 假设一个函数detect primes调用起来很昂贵 我想避免使用重复的参数重复调用它 我应该怎么办 使用缓存没有帮助 因为该函数可能会在不同的请求中同时调用 当两个请求都将缓存视为空值时 两个请求都将继续执行昂
  • C++ 中的句柄是什么?

    有人告诉我 句柄有点像指针 但其实不是 它允许您保留对对象的引用 而不是对象本身 更详细的解释是什么 句柄可以是从整数索引到指向内核空间中资源的指针的任何内容 其想法是 它们提供了资源的抽象 因此您无需了解太多有关资源本身的信息即可使用它
  • 直接在 Excel 工作表上使用 ActiveX 控件的必要和充分要求是什么?

    Microsoft Office 支持文章 添加或注册 ActiveX 控件 https support office com en us article Add or register an ActiveX control 8fc743a