ドキュメント データにビューを添付する
新しいドキュメント ビューがある場合は、それを既存のドキュメント データ オブジェクトにアタッチすることができる可能性があります。
既存のドキュメント データ オブジェクトにビューをアタッチできるかどうかを判断する方法
CreateEditorInstanceを実装します。
IVsEditorFactory::CreateEditorInstance
の実装では、IDE からQueryInterface
の実装が呼び出されると、既存のドキュメント データ オブジェクトに対してCreateEditorInstance
を呼び出します。QueryInterface
を呼び出すと、punkDocDataExisting
パラメーターに指定されている既存のドキュメント データ オブジェクトを調べることができます。ただし、クエリを実行する必要がある正確なインターフェイスは、手順 4 で説明されているように、ドキュメントを開いているエディターによって異なります。
既存のドキュメント データ オブジェクトに適切なインターフェイスが見つからない場合は、ドキュメント データ オブジェクトがエディターと互換性がないことを示すエラー コードをエディターに返します。
IDE の OpenStandardEditor の実装では、ドキュメントが別のエディターで開かれていることを通知するメッセージ ボックスが表示され、それを閉じるかどうかを確認するメッセージが表示されます。
このドキュメントを閉じると、Visual Studio では 2 回目のエディター ファクトリの呼び出しがされます。 この呼び出しでは、
DocDataExisting
パラメーターは NULL と等しくなります。 エディター ファクトリを実装により、独自のエディターでドキュメント データ オブジェクトを開くことができます。Note
既存のドキュメント データ オブジェクトを使用できるかどうかを判断するために、プライベート実装の実際の Visual C++ クラスへのポインターをキャストすることによって、インターフェイスの実装に関するプライベートの知識を使用することもできます。 たとえば、すべての標準エディターでは、IPersist から継承する
IVsPersistFileFormat
を実装します。 したがって、GetClassID に対してQueryInterface
を呼び出すことができます。また、既存のドキュメント データ オブジェクトのクラス ID が実装のクラス ID と一致する場合は、ドキュメント データ オブジェクトを操作できます。
信頼性の高いプログラミング
Visual Studio から CreateEditorInstance メソッドの実装が呼び出されると、punkDocDataExisting
パラメーター内の既存のドキュメント データ オブジェクトへのポインターが渡されます (存在する場合)。 このトピックの手順 4 のメモで説明されているように、punkDocDataExisting
で返されたドキュメント データ オブジェクトを調べて、ドキュメント データ オブジェクトがエディターに適しているかどうかを判断します。 適切な場合は、「複数のドキュメント ビューのサポート」で説明されているように、エディター ファクトリからデータの 2 番目のビューが提供されるはずです。 そうでない場合は、適切なエラー メッセージが表示されます。