我正在构建一个“从 Excel 导入”功能。它必须位于从非 MFC 应用程序调用的 DLL 中。必须提供电子表格的图像,用户可以在其中拖动选择框(以选择单元格),然后单击“导入”按钮,然后正确的事情发生。无法启动电子表格,旁边有一个按钮,并且在 DLL 中发生。
我在 DLL 中使用了 MFC 对话框,但在尝试在对话框的窗口中为 Excel 调出 OLE 客户端时被阻止了。我发现只有使用 OLE 显示 Excel 的支持才需要 SDI。我能够让自动化功能工作,我可以读取单元格并在我的对话框中绘制它们的“假图像”......但我担心这将不符合我的要求。
所以我尝试创建一个 SDI。我能够创建一个将 Excel 作为 OLE 客户端的 SDI。我能够处理“选择更改”事件,并获取我需要的单元格数据。我在这一点上被两个项目挫败了:
无法使此 SDI 在 MFC DLL 中工作。 CWinApp 构造函数崩溃,断言 AfxGetThread 不为空。将“theApp”移动到单个导出的 DLL 函数中的本地范围内,但仍然无法使其工作,但具有不同的症状:添加 AFX_MANAGE_STATE(AfxGetStaticModuleState()) 时崩溃;导出的 DLL 函数,如果我不使用它,则永远不会输入 OnInitInstance。尝试添加对应用程序的 Run() 函数的调用,但这没有帮助。如果有人认为他们知道问题出在哪里,我可以发布这段代码。
Excel 客户端项目处于活动状态时无法显示工具栏。我可以将我的“导入”(和其他选项)放在顶部的菜单栏上,但这还不够明显。甚至浮动工具栏也被关闭了。它会这样做是有道理的,因为存在一个无法对当前活动项目执行操作的工具栏会让人感到困惑……但就我而言,这是一个问题。
所以现在我想我需要回到对话方法,并嵌入一个 ActiveX 控件,该控件可以调出要导入的 Excel 电子表格文件。
必须允许我处理选择更改事件,或者必须允许我找到哪些单元格被选中(或者如果单击对话框上的“导入”按钮导致所选单元格未被选中,则最近被选中)。
它还必须具有合理的许可条款,因为这将用于公众广泛使用的商业应用程序。
我也对我一直在尝试的任何一种方法的“快速修复”感兴趣。
如果你只是想嵌入Excel,你不需要任何东西。
只需将其嵌入到标准 OCX 主机控件中即可。