Microsoft Office支持文章“Add or register an ActiveX control”说:
重要提示:并非所有ActiveX控件都可以直接在工作表中使用;一些只能在Microsoft Visual Basic for Applications(VBA)UserForms上使用 . 使用这些控件时,如果您尝试将对象添加到工作表,Excel将显示消息“无法插入对象” .
但是,我无法在任何地方找到有必要和足以使控件直接在工作表上使用的要求 .
我创建了一个新的C / ATL项目,我已经添加了一个ATL控件,接受了整个默认值 . 在编译,构建和注册控件之后,它出现在Excel的“更多控件”列表中(在“开发”>“插入”>“ActiveX控件”>“更多控件”下访问...)但在尝试插入工作表时,会看到“无法插入对象” “错误 .
What changes must I make to fix this?
要么
Where are Excel's requirements of ActiveX controls documented?
对于's worth, I'已验证向导生成的控件否则正常工作(使用ActiveX Control Test Container测试,我是从Visual C++ 2008 samples pack构建的) .
此外,我知道documentation for the ATL Control wizard's "Appearance" tab描述了"Insertable"复选框,如下所示:
选择此选项可使控件显示在Word和Excel等应用程序的“插入对象”对话框中 . 然后,任何支持嵌入对象的应用程序都可以通过此对话框插入您的控件 .
但是,此复选框(只是将“可插入”子项添加到注册表中)只会导致控件出现在“插入”>“文本”>“对象”对话框中 - 为避免疑问,我已尝试使用和不使用此选项并且无论如何都会产生同样的错误 .
尝试插入工作(Forms 2.0)控件时,尝试插入控件时的执行路径是'm currently comparing traces of Excel' . 关键区别在于VBE7.dll在加载类型库时(OLE/COM Object Viewer能够从我的DLL中正确加载 - 但在Excel执行了所有相同的读取后,它在写出EXD之前中止)...我想出来了 - 但是肯定有人为Excel构建了一个工作控件并且知道我缺少什么可以让我免除这种痛苦?!
Microsoft Windows 10 Pro v1511(10.0.10586.164)64位Microsoft Excel 2016 MSO(16.0.4312.1000)64位Microsoft Visual Studio社区2015(14.0.24720.00 Update 1)
2 回答
若要实现可插入MS Excel工作表的ATL ActiveX控件,请按照下列步骤操作:
确保C:\ Users \ $(UserName)\ AppData \ Local \ Temp \ Excel8.0中没有缓存的ActiveX控件信息* .exd文件,这可能是途中不明显的障碍
创建一个包含所有默认值的ATL DLL项目
2.1 . 添加x64配置作为现有Win32的副本 - 对于64位Excel,您将需要64位ActiveX控件
3.1 . 确保填写ProgID字段
3.2 . 在Interfaces页面上添加IPersistStreamInit
构建DLL并将其注册(regsvr32)
在Excel中,新控件在菜单Developer,...,More Controls中可见
源代码:Subversion / Trac
UPDATE :以下评论中的一个问题:
要查看操作中的控制操作,我们添加一些代码around there:
和
这将打印出有助于识别窗口/无窗模式的控件成员 . 输出是(最终在激活对象之后或从开始直接):
控件可以激活窗口和无窗口(除非
m_bWindowOnly
设置为true,在这种情况下强制窗口模式) . 跟踪显示控件处于窗口模式,并且该容器没有IOleInPlaceSiteWindowless
,这对于无窗口是必需的 .我有一些ActiveX和COM技术的经验,但还没有深入到Excel的世界 . 据我所知,所有COM组件总是闻起来过于复杂,除非你确切地知道你在做什么,但并不总是能找到需要做的事情 .
无论如何 - 我已经快速扫描/ googled - 这些是我能够找到的链接:
从这里:http://itdocument.com/6551512544/
任何通过尝试查找文章Q143432经常最终得到非现有页面 - 但能够找到这篇文章:
https://support.microsoft.com/en-us/kb/143432
这里报告了一些与其使用相关的问题:
http://www.verycomputer.com/418_e81ed24b6ac0cb79_1.htm
我建议尽可能避免使用ActiveX技术,如果不可能的话 - 尝试上面的链接 - 或者可能找到一些类似的开源代码示例 .
以下是我设法找到的一些示例:
这个是俄语:https://habrahabr.ru/post/149277/
这显然是某种方式谷歌翻译版本的同一页:http://developers-club.com/posts/149277/
它的源代码 - 我想:https://github.com/Lovesan/MyActiveX
我希望这会帮助你,但是 - 不确定 - 没有自己尝试过 .