gpt4 book ai didi

visual-studio - DSOFramer 在另一个窗口中关闭 Excel 文档。如果文件中未保存数据,dsoframer 无法打开并显示 "Attempt to access invalid address"

转载 作者:行者123 更新时间:2023-12-04 03:51:24 26 4
gpt4 key购买 nike

我正在使用 Microsoft's DSOFramer控件允许我在对话框中嵌入 Excel 文件,以便用户可以选择他的工作表,然后选择他的单元格范围;它与我对话框上的导入按钮一起使用。

问题是当我调用 DSOFramer's OPEN函数,如果我在另一个窗口中打开 Excel,它会关闭 Excel 文档(但让 Excel 继续运行)。如果它试图关闭的文档有未保存的数据,我会在另一个窗口中看到一个关闭 Excel 文档的对话框。如果文件中有未保存的数据,dsoframer无法打开消息框:Attempt to access invalid address .

我构建了源代码,并通过了它,它在其 CDsoDocObject::CreateFromFile 中进行了调用函数,调用 BindToObject在 IMoniker 类的对象上。 HR0x8001010a The message filter indicated that the application is busy .如果失败,它会尝试 InstantiateDocObjectServer通过 classidCLSID Microsoft Excel 工作表...这失败了 HRESULT0x80040154 Class not registered . InstantiateDocObjectServer只需调用CoCreateInstanceclassid , 首先是 CLSCTX_LOCAL_SERVER ,然后(如果失败)与 CLSCTX_INPROC_SERVER .

我知道DSOFramer是一个流行的示例项目,用于将 Office 应用程序嵌入到各种对话框和表单中。我希望其他人遇到过这个问题,并且可能对我如何解决这个问题有一些见解。我真的不希望它关闭任何其他打开的 Excel 文档,如果由于未保存的数据而无法关闭文档,我真的不希望它出错。

更新 1:我尝试更改 classid传递给 Excel.Application (我知道该类(class)会解决),但这没有用。在 CDsoDocObject , 它试图打开 key HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\DocObject ,但失败。我已经在视觉上确认该 key 不存在于我的注册表中;指南中存在 key ,但没有 DocObject子键。然后它会产生一个错误消息框:The associated COM server does not support ActiveX document embedding .当我尝试使用 Excel.Workbook programid 时,我得到了相似的(当然是不同的键)结果。 .

更新 2:我尝试启动 Excel 的第二个实例,希望我的自动化将绑定(bind)到它(是最近调用的)而不是问题 Excel 实例,但它似乎没有这样做。结果是一样的。我的问题似乎归结为:我正在调用 BindToObjectIMoniker 类的对象上,并接收 0x8001010A (RPC_E_SERVERCALL_RETRYLATER) The message filter indicated that the application is busy .我尝试过使用传递给 BindToObject 的标志。 (通过 SetBindOptions ),但似乎没有任何区别。

更新 3:它首先尝试使用 IMoniker 类进行绑定(bind)。如果失败,它会调用 CoCreateInstance对于clsid作为 fallback方法。这可能适用于其他 MS Office 对象,但当它是 Excel 时,该类适用于工作表。我将示例修改为 CoCreateInstance _Application ,然后得到工作簿,然后调用 Workbooks::Open对于目标文件,它返回一个 Worksheet 对象。然后我返回该指针并与原始示例代码路径合并。现在都在工作。

最佳答案

@金进

  • 您可以使用#import 指令来导入 Excel 的 OLB 文件。这应该生成(并自动包含一个 Excel .tlh 文件,其中包含 _Application 的结构(以及您需要的其余部分))。理想情况下,您应该找到与您希望支持的最早 Excel 版本相匹配的 OLB 文件。您本地系统上的那个可能在 c:\Program Files\Microsoft Office\Office12 中(假设您安装了 Office 2007)。它可能被命名为 Excel.olb 或 XL5EN32.OLB(不同,很明显,如果您没有安装 Excel 的美国英语版本。
    因此,将 .olb 文件复制到您的项目源目录,然后在源文件的顶部,为 #import "XL5EN32.olb"添加一行。
  • 是的,打开旧版本。保证这种情况的最佳方法是从您希望支持的最早版本的 Excel 安装中找到一个 OLB 文件(在上面的第 1 项中提到)。我使用 Office 2000 中的 Excel9.olb。从 Office 2007 到最新版本,我对 Excel 版本的测试都可以正常工作。
  • 是的,您应该在进行这些更改后正常使用 dsoframer。
  • 恐怕由于雇主的限制,我可能无法做到这一点。但是,如果您采用“库存” dsoframer 项目,进行本文第 1 部分中描述的更改,以及我在之前的文章中描述的更改,那么您几乎完全重新创建了我所拥有的。
  • 关于visual-studio - DSOFramer 在另一个窗口中关闭 Excel 文档。如果文件中未保存数据,dsoframer 无法打开并显示 "Attempt to access invalid address",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251909/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com