我正在使用Microsoft's DSOFramer
控件允许我在对话框中嵌入 Excel 文件,以便用户可以选择他的工作表,然后选择他的单元格范围;它与我对话框上的导入按钮一起使用。
问题是当我调用该DSOFramer's OPEN
函数时,如果我在另一个窗口中打开 Excel,它会关闭 Excel 文档(但让 Excel 继续运行)。如果它试图关闭的文档有未保存的数据,我会在另一个窗口中看到一个关闭 Excel 文档的对话框。如果文件中未保存数据,dsoframer
则无法打开并显示消息框:Attempt to access invalid address
.
我构建了源代码,并逐步完成,并在其CDsoDocObject::CreateFromFile
函数中进行了调用,调用BindToObject
了 IMoniker 类的对象。HR
是0x8001010a
The message filter indicated that the application is busy
。_ 失败时,它会尝试InstantiateDocObjectServer
通过Microsoft Excel 工作表...失败并显示. 只需调用,首先使用,然后(如果失败)使用.classid
CLSID
HRESULT
0x80040154
Class not registered
InstantiateDocObjectServer
CoCreateInstance
classid
CLSCTX_LOCAL_SERVER
CLSCTX_INPROC_SERVER
我知道DSOFramer
是一个流行的示例项目,用于将 Office 应用程序嵌入到各种对话框和表单中。我希望其他人遇到过这个问题,并且可能对我如何解决这个问题有一些见解。我真的不希望它关闭任何其他打开的 Excel 文档,如果由于未保存的数据而无法关闭文档,我真的不希望它出错。
更新 1:我尝试更改classid
传入的内容Excel.Application
(我知道该类会解析),但这没有用。在CDsoDocObject
中,它尝试打开 key HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\DocObject
,但失败了。我已经在视觉上确认该密钥不存在于我的注册表中;该指南存在密钥,但没有DocObject
子密钥。然后它会产生一个错误消息框:The associated COM server does not support ActiveX document embedding
。当我尝试使用Excel.Workbook programid
.
更新 2:我尝试启动 Excel 的第二个实例,希望我的自动化将绑定到它(是最近调用的)而不是问题 Excel 实例,但它似乎没有这样做。结果是一样的。我的问题似乎归结为:我正在调用BindToObject
class 的对象IMoniker
,并接收0x8001010A (RPC_E_SERVERCALL_RETRYLATER)
The message filter indicated that the application is busy
. 我尝试过使用传递给BindToObject
(通过SetBindOptions
)的标志,但似乎没有任何区别。
更新 3:它首先尝试使用 IMoniker 类进行绑定。如果失败,它会调用asCoCreateInstance
方法。这可能适用于其他 MS Office 对象,但当它是 Excel 时,该类适用于工作表。我将示例修改为,然后获取工作簿,然后为目标文件调用 ,该文件返回一个 Worksheet 对象。然后我返回该指针并与原始示例代码路径合并。现在都在工作。clsid
fallback
CoCreateInstance _Application
Workbooks::Open