1

[ 2 つの COM インターフェイス参照が同じインスタンスを指しているかどうかを確認する方法はありますか?からの続き ]

2 つの異なるソースからオブジェクトへの参照を取得してInspectorおり、一方のソースのアイテムが他方のソースのアイテムに対応するかどうかを判断できる必要があります。ただし、これまでに思いついたアプローチはどれも(確実に)機能しませんでした。

  • メソッドがインスペクターインスタンス自体ではなく、オンザフライで作成されたプロキシオブジェクトへの参照を返しているように見えるため、インターフェイスを単純に比較することはできませんでした。IUnknownInspectors.Item()試してみてください: 同じインデックスに 2 回アクセスすると、2 つの明確に異なるポインターが返されます。

  • 比べるInspector.CurrentItem.EntryIDのもダメ。新しい/保存されていないアイテムEntryIDは常に空白であり、一度に複数の保存されていないアイテムが開かれている可能性があります。

  • Inspector.CaptionまたはInspector.CurrentItem.Subject同様にあいまいです。

  • 一時的Inspector.CurrentItem.Subjectに(または実際には他の項目プロパティを)明確な値に設定してから、他のリストの種類でそれを探しますが、インスペクターで項目を「ダーティ」としてマークするという厄介な副作用があります。つまり、インスペクターを閉じるときに再度、ユーザーはアイテムを保存するように求められます (受信したメールを表示していた場合でも)。

他のアイデアはありますか?


環境:

Inspectors.NewInspectorSimple MAPI (エクスプローラーのコンテキスト メニューの [送信先] > [メール受信者] など) を介して開始された新しい電子メール メッセージがイベントを生成しないというよく知られたバグ/機能を回避しようとしています。インスペクタ (例: ツールバー ボタンの追加またはメッセージ作成時のコードの実行)。私の COM アドインには、イベントをキャッチするラッパー オブジェクトの内部リストがありますInspectorInspectors.NewInspectorおよびInspector.Closeイベントを監視することで、このリストに項目が追加および削除されます。

別のアプローチとして、私はシェル フックを使用しています。新しいインスペクター ウィンドウが作成または破棄されるたびに通知を受け取ることができるようになったので、そこに飛び込んでラッパー オブジェクトの内部リストをApplication.Inspectorsコレクションと一致させるのに適しているようです。それに応じて、新しいラッパー オブジェクトまたは孤立したラッパー オブジェクトを追加または削除します。

4

2 に答える 2

1

Inspector.CurrentItem.CreationTime比較することは私にとって十分に信頼できるものであることがわかりました。

于 2010-05-06T09:05:33.743 に答える
0

Is演算子を使用して、2 つのオブジェクト参照が同じオブジェクトを参照しているかどうかを確認することもできます。

元:

Debug.Print InspectorObj1 Is InspectorObj2

両方の参照が同じインスペクターを参照している場合、これはイミディエイト ウィンドウにTrueを出力します。

于 2011-11-07T18:41:05.560 に答える