TVM_GETITEMウィンドウ メッセージを使用して、ツリー項目のテキスト (プレーンなCommon Controls Tree Viewに含まれている) を読み取る C++ コードがあります。メッセージを受け取るツリー ビューは別のプロセスにあるため、ウィンドウ メッセージへの引数の 1 つが指す構造体に共有メモリを少し使用しています。リモート プロセスは私の制御下にないため、この作業を行う必要があります (Spy++ に似たアプリケーションを作成しています)。
これは原理的にはうまく機能しますが、ターゲット プロセスが大幅に異なる場合は失敗します。
ターゲット プロセスのコードが UNICODE を定義してビルドされたが、自分のコードはそうでなかった場合、2 つのプロセスは、TVITEM 構造体の文字列メンバーの構造について異なる考えを持つことになります。私はすでにIsWindowUnicode呼び出しを使用してこれを解決し、明示的にまたはのいずれ
TVM_GETITEMA
かを送信しますTVM_GETITEMW
(必要に応じて結果を再コーディングします)。呼び出しプロセスが 32 ビット モードでビルドされ、ターゲット プロセスが 64 ビット (またはその逆) である場合、ポインターのサイズが異なるため、 TVITEM 構造体のレイアウト (およびサイズ) は異なります。
私は現在、2番目の問題を解決する良い方法を見つけようとしています。この特定の使用例 (ツリー項目テキストの取得) は単なる例です。コードが送信する他のウィンドウ メッセージにも同じ問題が存在します。現在、次の 2 つの方法を検討しています。
- コードを 2 回ビルドしてから、ターゲット プロセスの動作に応じて 32 ビットまたは 64 ビット コードを実行します。これには、ビルドおよびパッケージング システムにいくつかの変更が必要であり、アーキテクチャ固有のコードを専用のプロセスに分割する必要があります (現在は DLL 内にあります)。それが完了すると、うまく機能するはずです。
- 実行時にターゲット プロセスのイメージ フォーマットを検出し、32 ビットまたは 64 ビット幅のポインターを明示的に使用するTVITEM 構造体の代わりにカスタム構造体を使用します。これには、リモート プロセスのアーキテクチャを検出するためのコードを記述し (リモート プロセスでGetModuleFileNameを呼び出してから、 Image Help Libraryを使用して PE ヘッダーを分析することでこれを実行できることを願っています)、2 つの構造体 (1 つは 32 ビット ポインターを持ち、もう 1 つは を含む) をハードコーディングする必要があります。 64ビット)。さらに、共有メモリ アドレスが 32 ビット アドレス空間にあることを確認する必要があります (32 ビット モードでコンパイルされている場合でも、自分のコードが常にアクセスできるようにするため)。
他の誰かが同様の問題を解決する必要がありましたか? もっと簡単な解決策はありますか?