在Excel工作表上直接使用ActiveX控件需要满足哪些要求?

时间:2016-03-23 14:59:32

标签: c++ excel com activex atl

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

  

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

但是,我无法在任何需要必需 的要求的任何地方找到记录,以便直接在工作表上使用该控件。

我创建了一个新的C ++ / ATL项目,我已经添加了一个ATL控件,接受了整个默认值。在编译,构建和注册控件之后,它出现在Excel的“更多控件”列表中(在Developer> Insert> ActiveX Controls> More Controls ...下访问),但在尝试插入工作表时,可以看到这个“无法插入对象“错误。

我必须做出哪些更改才能解决此问题?

OR

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

对于它的价值,我已经验证了向导生成的控件在其他情况下工作正常(使用ActiveX Control Test Container测试Visual C++ 2008 samples pack)。

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

  

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

但是,此复选框(只是将“可插入”子项添加到注册表中)仅导致控件出现在“插入”按钮中。文字>对象对话框 - 为避免疑问,我已尝试使用和不使用此选项,并且无论如何都会产生相同的错误。

我正在尝试在尝试插入工作(Forms 2.0)控件时插入我的控件时,比较Excel的执行路径的痕迹。加载类型库(OLE/COM Object Viewer能够从我的DLL中正确加载)时,关键区别似乎在VBE7.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 个答案:

答案 0 :(得分:3)

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

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

  2. 创建一个包含所有默认值的

  3. 的AT​​L DLL项目

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

    1. 使用向导
    2. 添加ATL Control类

      enter image description here

      3.1。确保填写ProgID字段

      enter image description here

      3.2。在Interfaces页面上添加IPersistStreamInit

      enter image description here

      1. 构建DLL并将其注册(regsvr32)

      2. 在Excel中,新控件在菜单Developer,...,More Controls

      3. 中可见

        enter image description here

        enter image description here

        1. 插入它并从那里获得乐趣
        2. enter image description here

          源代码:Subversion / Trac

          更新:以下评论提出的问题:

            

          ...... 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,这对于无窗口是必需的。

答案 1 :(得分:1)

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

无论如何 - 我已经快速扫描/谷歌搜索了 - 这些是我能找到的链接:

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

  

Excel 97&amp; 2000问题Excel 97&amp; 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

我希望这会对你有所帮助 - 但不确定 - 我自己没有尝试过。