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

9 浏览
0 Comments

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

微软Office支持文章《添加或注册ActiveX控件》中提到:

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

然而,我无法找到任何记录控件可以直接在工作表上使用所需和充分的要求的文件。

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

我需要做出什么更改才能解决这个问题?

或者

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

值得一提的是,我已经验证了向导生成的控件在其他方面都可以正常工作(使用ActiveX控件测试容器进行测试,我从Visual C++ 2008示例包中构建了它)。

此外,我知道ATL控件向导的“外观”选项卡的文档描述了“可插入”复选框如下:

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

然而,这个复选框(简单地向注册表添加“Insertable”子键)只会导致该控件出现在插入 > 文本 > 对象对话框中 - 为了避免疑问,我已经尝试过勾选和不勾选该复选框,但无论如何都会产生相同的错误。

我当前正在比较插入我的控件时Excel的执行路径与插入有效(Forms 2.0)控件时的执行路径的跟踪。关键区别似乎在于加载类型库时的VBE7.dll,OLE/COM对象查看器能够从我的DLL中正确加载它,但在Excel执行完所有相同的读取操作后,它在写出EXD之前就中止了...我正在钻研一些汇编代码,希望能找到答案,但肯定有人已经为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)

0
0 Comments

实现一个可以插入到MS Excel表中的ATL ActiveX控件,按照以下步骤进行操作:

1. 确保在C:\Users\$(用户名)\AppData\Local\Temp\Excel8.0目录下没有缓存的ActiveX控件信息*.exd文件,这可能是一个障碍。

2. 创建一个带有默认设置的ATL DLL项目。

2.1. 添加x64配置作为已存在的Win32的一个副本-对于64位Excel,您需要64位ActiveX控件。

3. 使用向导添加ATL控制类。

3.1. 确保填写ProgID字段。

3.2. 在接口页面上添加IPersistStreamInit。

4. 构建并注册DLL(regsvr32)。

5. 在Excel中,在菜单“开发人员”中可以看到新的控件,选择“更多控件”。

6. 插入控件并开始使用。

源代码: Subversion/Trac

更新: 以下是评论中的一个问题:

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

为了看到控件的操作,让我们在这里添加一些代码:

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

HRESULT OnDraw(ATL_DRAWINFO& di)
{
    const CComQIPtr 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,这是无窗口模式所必需的。

我确信我之前已经尝试过这些步骤,但显然我在途中必须改变了其他东西。这完美地运行了-非常感谢!

一个真正令人困惑的事情是*.exd文件。Excel会缓存控件信息,可能会忽略您的代码更改和修复尝试。这可能是您的良好代码在某个时候仍然被Excel拒绝的原因。

实际上,我很早就发现Excel会将类型库缓存在EXD文件中,并且知道在某些情况下可能会导致问题-但我发现EXD在我的情况下甚至没有被写出。通过研究程序集,我发现类型库中的任何非双接口都会导致整个库被拒绝:因此,我尝试在单个项目中尝试多个不同的控件配置的尝试被单个失败的情况破坏了。这无疑是一个相当混乱的情况!

你知道Excel是否支持无窗口激活吗?我原以为它支持,但现在我无法使其工作...如果你愿意,我可以发布另一个问题(并提供另一个奖励)!;-)

我不确定,但我认为Excel实现了必要的功能来托管无窗口控件。特别是在我的代码中,如果我在OnDraw中设置断点,我会发现托管控件是可见的,并且在没有窗口创建的情况下完成其工作(m_hWnd == NULL)。

0
0 Comments

ActiveX控件在Excel工作表上直接使用所需的必要和充分条件是什么?这个问题的出现可能是因为用户对ActiveX控件在Excel中的使用不够了解,想要了解使用ActiveX控件的要求。解决方法可能是通过查找相关的文档和示例代码来获取所需的信息。

根据用户提供的信息,可以从中整理出以下内容:

根据用户提供的链接,可以得出以下结论:

- Excel 97和2000版本存在问题,会出现“无法插入对象”的错误信息。

- ActiveX控件必须支持聚合才能被插入到Excel工作表中,如果不支持聚合,Excel将不允许将其插入。

- 可能存在一些与聚合相关的问题,用户提供了一个报告了相关问题的链接。

用户建议如果可能的话应避免使用ActiveX技术,如果不可避免,可以尝试提供的链接或者寻找一些类似的开源代码示例。

用户还提供了一些相关的示例代码链接,包括一个俄文页面、一个经过谷歌翻译的页面和一个GitHub上的源代码链接。

希望这些信息能对你有所帮助,但不能保证,因为我没有自己尝试过。

0