我正在使用Microsoft的DSOFramer控件,以便在我的对话框中嵌入Excel文件,以便用户可以选择工作表,然后选择单元格范围;它与我的对话框上的导入按钮一起使用。
问题在于,当我调用DSOFramer的OPEN函数时,如果我已经在另一个窗口中打开了Excel,则会关闭Excel文档(但保留Excel运行)。如果要关闭的文档有未保存的数据,则会弹出一个对话框来关闭另一个窗口中的Excel文档。如果文件中有未保存的数据,则dsoframer无法打开并显示消息框:“尝试访问无效地址”。
我构建了源代码,并进行了步骤处理,在其CDsoDocObject :: CreateFromFile函数中进行了调用,调用类IMoniker的BindToObject。 HR为0x8001010a,“消息过滤器指示应用程序正忙”。在失败时,它尝试通过CLSID Microsoft Excel Worksheet的classid来InstantiateDocObjectServer…这将以HRESULT 0x80040154“未注册的类”失败。 InstantiateDocObjectServer只是在classid上调用CoCreateInstance,首先使用CLSCTX_LOCAL_SERVER,然后(如果失败)使用CLSCTX_INPROC_SERVER。
我知道DSOFramer是一个流行的示例项目,用于在各种对话框和表单中嵌入Office应用程序。我希望其他人也遇到了这个问题,并可能对如何解决它有一些见解。我真的不希望它关闭任何其他打开的Excel文档,而且如果由于未保存的数据而无法关闭文档,我真的不希望它出现错误。
更新1:我已尝试更改传递给Excel.Application的classid(我知道该类将解析),但是没有成功。在CDsoDocObject中,它尝试打开键HKEY_CLASSES_ROOT \ CLSID \ {00024500-0000-0000-C000-000000000046} \ DocObject,但失败了。我已经视觉确认该键不在我的注册表中;该键存在于指南中,但没有DocObject子键。然后它会产生一个错误消息框:“关联的COM服务器不支持ActiveX文档嵌入”。当我尝试使用Excel.Workbook programid时,我会得到类似的结果(当然是不同的键)。
更新2:我尝试启动第二个Excel实例,希望我的自动化可以绑定到它(成为最近调用的实例),而不是问题Excel实例,但似乎没有这样做。结果是一样的。我的问题似乎归结为:我正在调用
更新3:它首先尝试使用
问题在于,当我调用DSOFramer的OPEN函数时,如果我已经在另一个窗口中打开了Excel,则会关闭Excel文档(但保留Excel运行)。如果要关闭的文档有未保存的数据,则会弹出一个对话框来关闭另一个窗口中的Excel文档。如果文件中有未保存的数据,则dsoframer无法打开并显示消息框:“尝试访问无效地址”。
我构建了源代码,并进行了步骤处理,在其CDsoDocObject :: CreateFromFile函数中进行了调用,调用类IMoniker的BindToObject。 HR为0x8001010a,“消息过滤器指示应用程序正忙”。在失败时,它尝试通过CLSID Microsoft Excel Worksheet的classid来InstantiateDocObjectServer…这将以HRESULT 0x80040154“未注册的类”失败。 InstantiateDocObjectServer只是在classid上调用CoCreateInstance,首先使用CLSCTX_LOCAL_SERVER,然后(如果失败)使用CLSCTX_INPROC_SERVER。
我知道DSOFramer是一个流行的示例项目,用于在各种对话框和表单中嵌入Office应用程序。我希望其他人也遇到了这个问题,并可能对如何解决它有一些见解。我真的不希望它关闭任何其他打开的Excel文档,而且如果由于未保存的数据而无法关闭文档,我真的不希望它出现错误。
更新1:我已尝试更改传递给Excel.Application的classid(我知道该类将解析),但是没有成功。在CDsoDocObject中,它尝试打开键HKEY_CLASSES_ROOT \ CLSID \ {00024500-0000-0000-C000-000000000046} \ DocObject,但失败了。我已经视觉确认该键不在我的注册表中;该键存在于指南中,但没有DocObject子键。然后它会产生一个错误消息框:“关联的COM服务器不支持ActiveX文档嵌入”。当我尝试使用Excel.Workbook programid时,我会得到类似的结果(当然是不同的键)。
更新2:我尝试启动第二个Excel实例,希望我的自动化可以绑定到它(成为最近调用的实例),而不是问题Excel实例,但似乎没有这样做。结果是一样的。我的问题似乎归结为:我正在调用
IMoniker
类的BindToObject
,并收到0x8001010A(RPC_E_SERVERCALL_RETRYLATER)
消息过滤器指示应用程序正忙
。我尝试使用通过SetBindOptions
传递给BindToObject
的标志进行操作,但似乎没有任何区别。更新3:它首先尝试使用
IMoniker
类进行绑定。如果失败,则调用CoCreateInstance
作为fallback
方法来获取clsid
。这可能适用于其他MS Office对象,但对于Excel而言,该类是工作表。我修改了示例以CoCreateInstance _Application
,然后获取了工作簿,接着调用目标文件的Workbooks::Open
,返回一个工作表对象。然后我将该指针合并回原始示例代码路径。现在一切正常。