[ 2 つの COM インターフェイス参照が同じインスタンスを指しているかどうかを確認する方法はありますか?からの続き ]
2 つの異なるソースからオブジェクトへの参照を取得してInspector
おり、一方のソースのアイテムが他方のソースのアイテムに対応するかどうかを判断できる必要があります。ただし、これまでに思いついたアプローチはどれも(確実に)機能しませんでした。
メソッドがインスペクターインスタンス自体ではなく、オンザフライで作成されたプロキシオブジェクトへの参照を返しているように見えるため、インターフェイスを単純に比較することはできませんでした。
IUnknown
Inspectors.Item()
試してみてください: 同じインデックスに 2 回アクセスすると、2 つの明確に異なるポインターが返されます。比べる
Inspector.CurrentItem.EntryID
のもダメ。新しい/保存されていないアイテムEntryID
は常に空白であり、一度に複数の保存されていないアイテムが開かれている可能性があります。Inspector.Caption
またはInspector.CurrentItem.Subject
同様にあいまいです。一時的
Inspector.CurrentItem.Subject
に(または実際には他の項目プロパティを)明確な値に設定してから、他のリストの種類でそれを探しますが、インスペクターで項目を「ダーティ」としてマークするという厄介な副作用があります。つまり、インスペクターを閉じるときに再度、ユーザーはアイテムを保存するように求められます (受信したメールを表示していた場合でも)。
他のアイデアはありますか?
環境:
Inspectors.NewInspector
Simple MAPI (エクスプローラーのコンテキスト メニューの [送信先] > [メール受信者] など) を介して開始された新しい電子メール メッセージがイベントを生成しないというよく知られたバグ/機能を回避しようとしています。インスペクタ (例: ツールバー ボタンの追加またはメッセージ作成時のコードの実行)。私の COM アドインには、イベントをキャッチするラッパー オブジェクトの内部リストがありますInspector
。Inspectors.NewInspector
およびInspector.Close
イベントを監視することで、このリストに項目が追加および削除されます。
別のアプローチとして、私はシェル フックを使用しています。新しいインスペクター ウィンドウが作成または破棄されるたびに通知を受け取ることができるようになったので、そこに飛び込んでラッパー オブジェクトの内部リストをApplication.Inspectors
コレクションと一致させるのに適しているようです。それに応じて、新しいラッパー オブジェクトまたは孤立したラッパー オブジェクトを追加または削除します。