首页 文章

在Excel工作表上直接使用ActiveX控件有哪些必要且足够的要求?

提问于
浏览
5

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 回答

  • 1

    若要实现可插入MS Excel工作表的ATL ActiveX控件,请按照下列步骤操作:

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

    • 创建一个包含所有默认值的ATL DLL项目

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

    • 使用向导添加ATL Control类

    enter image description here

    3.1 . 确保填写ProgID字段

    enter image description here

    3.2 . 在Interfaces页面上添加IPersistStreamInit

    enter image description here

    • 构建DLL并将其注册(regsvr32)

    • 在Excel中,新控件在菜单Developer,...,More Controls中可见

    enter image description here

    enter image description here

    • 插入它并从那里获得乐趣

    enter image description here

    源代码:Subversion / Trac

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

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

    要查看操作中的控制操作,我们添加一些代码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 ,这对于无窗口是必需的 .

  • 3

    我有一些ActiveX和COM技术的经验,但还没有深入到Excel的世界 . 据我所知,所有COM组件总是闻起来过于复杂,除非你确切地知道你在做什么,但并不总是能找到需要做的事情 .

    无论如何 - 我已经快速扫描/ googled - 这些是我能够找到的链接:

    从这里:http://itdocument.com/6551512544/

    Excel 97和2000问题Excel 97和2000问题Q171280 Q171280 ,,错误消息Excel97中的“无法插入对象” . ActiveX控件必须支持插入聚合ActiveX控件必须支持将聚合插入电子表格中 . 如果他们不支持进入电子表格 . 如果它们不支持聚合,Excel将不允许插入它们 . 聚合后,Excel将不允许插入它们 . 有关这方面的更多信息,请参阅本文底部的Q143432 Q143432中提供的有关此内容的更多信息 . 文章的底部 .

    任何通过尝试查找文章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

    我希望这会帮助你,但是 - 不确定 - 没有自己尝试过 .

相关问题