Share via


ドキュメント データにビューを添付する

新しいドキュメント ビューがある場合は、それを既存のドキュメント データ オブジェクトにアタッチすることができる可能性があります。

既存のドキュメント データ オブジェクトにビューをアタッチできるかどうかを判断する方法

  1. CreateEditorInstanceを実装します。

  2. IVsEditorFactory::CreateEditorInstance の実装では、IDE から QueryInterface の実装が呼び出されると、既存のドキュメント データ オブジェクトに対して CreateEditorInstance を呼び出します。

    QueryInterface を呼び出すと、punkDocDataExisting パラメーターに指定されている既存のドキュメント データ オブジェクトを調べることができます。

    ただし、クエリを実行する必要がある正確なインターフェイスは、手順 4 で説明されているように、ドキュメントを開いているエディターによって異なります。

  3. 既存のドキュメント データ オブジェクトに適切なインターフェイスが見つからない場合は、ドキュメント データ オブジェクトがエディターと互換性がないことを示すエラー コードをエディターに返します。

    IDE の OpenStandardEditor の実装では、ドキュメントが別のエディターで開かれていることを通知するメッセージ ボックスが表示され、それを閉じるかどうかを確認するメッセージが表示されます。

  4. このドキュメントを閉じると、Visual Studio では 2 回目のエディター ファクトリの呼び出しがされます。 この呼び出しでは、DocDataExisting パラメーターは NULL と等しくなります。 エディター ファクトリを実装により、独自のエディターでドキュメント データ オブジェクトを開くことができます。

    Note

    既存のドキュメント データ オブジェクトを使用できるかどうかを判断するために、プライベート実装の実際の Visual C++ クラスへのポインターをキャストすることによって、インターフェイスの実装に関するプライベートの知識を使用することもできます。 たとえば、すべての標準エディターでは、IPersist から継承する IVsPersistFileFormat を実装します。 したがって、GetClassID に対して QueryInterface を呼び出すことができます。また、既存のドキュメント データ オブジェクトのクラス ID が実装のクラス ID と一致する場合は、ドキュメント データ オブジェクトを操作できます。

信頼性の高いプログラミング

Visual Studio から CreateEditorInstance メソッドの実装が呼び出されると、punkDocDataExisting パラメーター内の既存のドキュメント データ オブジェクトへのポインターが渡されます (存在する場合)。 このトピックの手順 4 のメモで説明されているように、punkDocDataExisting で返されたドキュメント データ オブジェクトを調べて、ドキュメント データ オブジェクトがエディターに適しているかどうかを判断します。 適切な場合は、「複数のドキュメント ビューのサポート」で説明されているように、エディター ファクトリからデータの 2 番目のビューが提供されるはずです。 そうでない場合は、適切なエラー メッセージが表示されます。