要实现可插入 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 类
3.1.确保填写 ProgID 字段
3.2.在 Interfaces 页面添加 IPersistStreamInit
构建 DLL 并注册它 (regsvr32)
在 Excel 中,新控件在菜单“开发人员”、“...”、“更多控件”中可见
- 插入它并从中享受乐趣
源代码:颠覆 http://www.alax.info/svn/public/trunk/Utilities/Miscellaneous/ExcelControl//Trac http://www.alax.info/trac/public/browser/trunk/Utilities/Miscellaneous/ExcelControl
UPDATE: 下面评论中的一个问题:
...Excel是否支持无窗口激活?
要查看实际的控制操作,我们添加一些代码在那儿附近 http://www.alax.info/trac/public/browser/trunk/Utilities/Miscellaneous/ExcelControl/Sample.h#L37:
CSample()
{
CTrace::SetLevel(4);
and
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
,对于无窗来说这是强制性的。