コントロールを使用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
。_ その失敗で、それはMicrosoftExcelワークシートを使用しようとします...これはので失敗InstantiateDocObjectServer
します。は、最初に、を呼び出し、次に(失敗した場合は)を呼び出します。classid
CLSID
HRESULT
0x80040154
Class not registered
InstantiateDocObjectServer
CoCreateInstance
classid
CLSCTX_LOCAL_SERVER
CLSCTX_INPROC_SERVER
DSOFramer
さまざまなダイアログやフォームにOfficeアプリを埋め込むための人気のあるサンプルプロジェクトです。他の誰かがこの問題を抱えていて、私がこれをどのように解決できるかについての洞察を持っているかもしれないことを願っています。開いている他のExcelドキュメントを閉じたくないし、データが保存されていないためにドキュメントを閉じることができない場合にエラーアウトしたくない。
classid
更新1:渡されたものを変更しようとしましたがExcel.Application
(クラスが解決されることはわかっています)、それは機能しませんでした。でCDsoDocObject
、キーを開こうとします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にバインドされることを期待して、Excelの2番目のインスタンスを起動しようとしましたが、そうはならなかったようです。結果は同じでした。私の問題は、要約すると次のようになります。BindToObject
クラスのオブジェクトでを呼び出し、IMoniker
を受信してい0x8001010A (RPC_E_SERVERCALL_RETRYLATER)
The message filter indicated that the application is busy
ます。BindToObject
(を介して)に渡されたフラグで遊んでみましたSetBindOptions
が、何も違いがないようです。
更新3:最初にIMonikerクラスを使用してバインドを試みます。それが失敗した場合は、メソッドCoCreateInstance
としてを呼び出します。これは他のMSOfficeオブジェクトでも機能する可能性がありますが、Excelの場合、クラスはワークシート用です。サンプルをに変更してから、ワークブックを取得し、ターゲットファイルに対してを呼び出しました。これにより、ワークシートオブジェクトが返されます。次に、そのポインターを返し、元のサンプルコードパスにマージして戻しました。すべてが現在機能しています。clsid
fallback
CoCreateInstance _Application
Workbooks::Open