3

エミュレーション レイヤーなしで一部のコードと 32 ビット エミュレーション レイヤー内の一部のコードを呼び出すことができるアプリケーションを作成できるかどうかに興味があります。

その主な理由は、API SetWindowHook を使用する必要があり、64 ビット アプリケーションと 32 ビット アプリケーションの両方にフックを設定したいからです。

確かに、2 つのアプリケーション (1 つは 32 ビット用、もう 1 つは 64 ビット用) を作成し、それらを同時に起動できます。ただし、それらを管理するためのコード (開始、停止、アップグレードなど) がさらに必要になります。

それで、1つのアプリケーションを持つことが本当に可能かどうかを探しています。

私が持っている唯一のアイデアは、1 つのアプリケーションと 2 つの COM DLL (32 ビットと 64 ビット) を用意し、代理プロセスを使用して 32 ビットのコードを実行することです。ただし、追加の COM ラッパーなどが必要になります。

4

4 に答える 4

5

より良い方法を提案することはできませんが、私にできることは、まったく同じ種類のことを行う単純なフックベースのツールのソースを提供することです. あなたに役立つビットを自由に感じてください:

http://www.pretentiousname.com/NoBarTab/NoBarTab_poc3.zip

(将来、この URL が機能しなくなった場合は、レベルを上げてください。おそらく、私がそれを完成させて、ツールとそのソースの実際のページを作成したためです。)

これは VS2010 C++ プロジェクトですが、古い IDE で簡単にコンパイルできるはずです。(これを書いていると、VS2010 を今のところこれ以上使うのは気が進まなくなりました。)

明らかに、それを使用する場合は、ツールとの競合を避けるために、ウィンドウ クラスとバイナリ名の名前を変更してください。(名前に「NoBarTab」が含まれるもの。)

FWIW、これは私が数週間前に書き始めたツールですが、まだ完成していません。とはいえ、フッキング部分は完成。ウィンドウの作成をフックして、特定のプロセスで Windows 7 のタスクバーからタブを削除できるようにします。(特に、VMware がその機能を使用する方法が嫌いです。) いずれにせよ、完成したらソース コードをリリースするつもりでした...

32/64 ビットのフッキング部分はすべて完了です。私が回避できなかった唯一のことは、構成 UI を追加して、どのプロセスを考慮する必要があるかを指定できるようにすることですが、それはあなたがしていることにとって重要ではありません。

(Win7 タスクバーからタブを削除する方法は完全なハックであり、Windows の将来のバージョンでは機能しなくなる可能性があると言わざるを得ません。それを行う方法が文書化されていないため、面倒な方法で解決する必要がありました。ただし、すべて「適切」であることに興味があります。)

また、実際のロジックのほとんどすべてがメインの 64 ビット exe 内にあるようにしました。32 ビット EXE は、32 ビット フック DLL をインストールするために存在するだけであり、32 ビットと 64 ビットの両方のフック DLL は、メインの 64 ビット exe の非表示ウィンドウにメッセージをポストするだけです。それがあなたのやっていることに適しているかどうかは、あなたの判断に委ねますが、できるだけすべてを 1 か所にまとめたいというあなたの希望にはおそらく合っていると思います。

それが役に立つことを願っています!

于 2010-11-26T17:54:07.050 に答える
3

SetWinEventHookは、32 ビット/64 ビットのものを処理する高レベルのフック API です。これは、今日の別の質問への回答で出てきました。問題が解決した場合に備えて、ここで言及する価値があると思いました。向こうの彼の答えに対する@atzzの完全な功績。

SetWinEventHook が下位レベルのSetWindowsHookExと同じくらい適しているかどうかは、実際に何をしているかによって異なります。(私の場合、他の回答で NoBarTab コードを書き直して、より単純な API を使用することができます。ただし、まだ詳しく調べていません。)

于 2010-11-27T18:32:25.890 に答える
1

エミュレーションレイヤーの最大の理由は、64ビットコードのアドレス空間が大きくなることです。たとえば、0x12345678aa000000にアドレス指定されたデータがあるとします。そのポインタを32ビットコードに直接渡すと、32ビットアドレス空間に切り捨てられます。つまり、上位32ビットが削除されます。したがって、データのアドレスは、32ビットコードでは0x00000000aa000000のようになります。これは明らかに完全に異なる領域であり、意図したものではありません。

はい、可能です。いいえ、x86およびx64アセンブリの経験が豊富で、32ビットソースコードにアクセスして、実際に64ビットスペースで実行されていることを確認し、64ビットスペースにもアクセスできる場合を除いて、これを行うべきではありません。 32ビットコードに渡すすべてのデータが32ビットアドレス範囲内にあることを確認するためのビットコード。

いいえ、UBERを醜いハックしようとしない限り、エミュレーションレイヤーなしで32ビットコードを実行することは望ましくありません。

于 2010-11-26T17:25:41.977 に答える
0

各プロセスはすべて32ビットまたはすべて64ビットである必要があるため、アウトプロセスCOMのようなものを介してそれを行うことが唯一の希望だと思います。

于 2010-11-26T17:27:28.470 に答える