- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Microsoft Office 支持文章“Add or register an ActiveX control”说:
IMPORTANT: Not all ActiveX controls can be used directly on worksheets; some can be used only on Microsoft Visual Basic for Applications (VBA) UserForms. When you work with these controls, Excel displays the message Cannot insert object if you try to add them to a worksheet.
但是,我无法在任何地方找到有关直接在工作表上使用控件的必要和充分要求的记录。
我创建了一个新的 C++/ATL 项目,并向其中添加了一个 ATL 控件,并始终接受默认设置。编译、构建和注册控件后,它出现在 Excel 的“更多控件”列表中(在“开发人员”>“插入”>“ActiveX 控件”>“更多控件...”下访问)但是在尝试插入工作表时会看到此“无法插入对象"错误。
我必须进行哪些更改才能解决此问题?
或
Excel 对 ActiveX 控件的要求记录在哪里?
就其值(value)而言,我已经验证向导生成的控件在其他方面可以正常工作(使用我从 ActiveX Control Test Container 构建的 Visual C++ 2008 samples pack 进行测试)。
此外,我知道 documentation for the ATL Control wizard's "Appearance" tab如下描述“可插入”复选框:
Select this option to have your control appear in the Insert Object dialog box of applications such as Word and Excel. Your control can then be inserted by any application that supports embedded objects through this dialog box.
但是,这个复选框(它只是将“Insertable”子项添加到注册表)只会导致控件出现在“插入”>“文本”>“对象”对话框中——为避免疑义,我已经尝试过使用和不使用它检查并以任何一种方式产生相同的错误。
我目前正在比较尝试插入我的控件时 Excel 的执行路径与尝试插入工作 (Forms 2.0) 控件时的执行路径。关键区别似乎在于加载类型库时的 VBE7.dll(OLE/COM Object Viewer 能够从我的 DLL 中正确加载它——但在 Excel 从中执行所有相同的读取之后,它在写出 EXD 之前中止)。 ..我现在正在研究一些程序集,徒劳地希望我能弄明白——但肯定某人已经为 Excel 构建了一个工作控件并且知道我缺少什么可以节省我这么痛?!
<支持>Microsoft Windows 10 专业版 v1511 (10.0.10586.164) 64 位
Microsoft Excel 2016 MSO (16.0.4312.1000) 64 位
Microsoft Visual Studio 社区 2015(14.0.24720.00 更新 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 控件
3.1。确保填写 ProgID 字段
3.2。在Interfaces页面添加IPersistStreamInit
构建 DLL 并注册它 (regsvr32)
在 Excel 中,新控件在菜单开发人员、...、更多控件中可见
源代码:Subversion/Trac
更新:来自以下评论的问题:
...whether Excel supports windowless activation?
要查看实际的控制操作,让我们添加一些代码 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
,这对于无窗口是必需的。
关于c++ - 要在 Excel 工作表上直接使用 ActiveX 控件,有哪些必要和充分的要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181635/
我正在使用 this solution在二进制矩阵中找到与图像边界对齐的矩形。假设现在我想找到一个不与图像边框对齐的矩形,并且我不知道它的方向;找到它的最快方法是什么? 为了示例,让我们寻找一个仅包含
else: 行在这个 Python 程序中是否正确/必要? from random import randrange for n in range(10): r = randrange(0,1
在 TDPL 7.1.5.1 中讨论了将 Widget w2 分配给 w1 并且作者指出“将 w2 逐个字段分配给 w1 会将 w2.array 分配给 w1.array——一个简单的数组边界分配,而
我是一名优秀的程序员,十分优秀!