問題タブ [wow64]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 32 ビット C# から 64 ビット C++ への PostMessage パラメータ
32 ビット C# アプリケーションからの wParam が 64 ビット C++ プロセスに途中で変更されているときに渡されるポインターの内容に問題があります。
32.exe (C#) と 64.exe (C++) の 2 つのプロセスがあります。64.exe は 32.exe の子プロセスとして起動されます。32.exe は 64.exe のウィンドウ メッセージをポストします。そのうちの 1 つには、RECT 構造体の配列へのポインターである wParam があります。64.exe と 32.exe の両方に、32.dll と 64.dll という共通の DLL (C++ で記述されていますが、もちろん異なるプラットフォーム用にコンパイルされています) があります。
32.dll で RECT* を期待する関数は、後でポストされる同じ RECT* を使用して 32.exe から直接呼び出され、これはうまく機能します。その後、同じ関数を呼び出して wParam を RECT* にキャストする 64.exe にメッセージを投稿します。
メッセージは次のように投稿されます。
デバッグにより、メッセージが受信されたことを確認しましたが、wParam アドレスは以前と同じではありません。これは予期しないことではありませんが、現在ポイントしているメモリの内容は定義されていません (そこにあるものを確認しようとすると、アクセス違反が発生します)。
ここで何が起きてるの?
iis-7 - WOW64 で IIS 7 をアンインストールするには?
私が保守している Web サーバー インストーラーでは、インストーラーが IIS 7 や ASP (Vista 以降) をインストールしたかどうかを追跡し、インストールした場合は適切な値をレジストリに保存します。アンインストール中に、その値が存在し、そのマシンで IIS を使用している Web サイトが他にない場合、ユーザーは IIS/ASP を削除するかどうかを尋ねられます。その場合、インストールしたものはすべて削除します。
以下は、IIS 7 と ASP を削除するために起動するコマンドです (わかりやすくするために改行が追加されています)。
これは 32 ビット システムでは正常に機能しますが、WOW64 リダイレクトが無効になっていても、64 ビット システムではまったく機能しません。(インストーラーは必要に応じてインストールの最後に再起動を行うため、/norestart パラメーターは無視してください。) このコマンドを管理者レベルのコマンド プロンプト (/norestart パラメーターなし) に入力しようとしましたが、役に立ちませんでした。 .
インストール中に IIS 7/ASP をインストールするために使用するコマンドも同様に長く、常に機能するため、アンインストール コマンド ラインが長すぎることが問題であるとは考えられません。(その理論をテストするために、コマンドを 2 つのコマンドに分割してみました。1 つは ASP コンポーネントのみを削除し、もう 1 つは残りを削除します。同じ問題で、何も削除されませんでした。)
64ビットシステムで必要なことを実行する他のコマンドはありますか? その場合、WOW64 リダイレクトを無効にする必要がありますか? また、32 ビット システムでも動作しますか? (Vista 以降のシステムでのみ呼び出されます。それ以前のシステムでは、ユーザーが IIS と ASP が事前にインストールされていることを確認する必要があります。)
windows - SHGetSpecialFolderPath、32ビットアプリケーションから64ビットCSIDLにアクセスする方法
64ビットシステムで実行されている32ビットアプリケーションから64ビットアプリケーションのデフォルトフォルダーにアクセスする方法はありますか?
たとえば、32ビットアプリケーションからCSIDL_PROGRAM_FILESでSHGetSpecialFolderPathを使用すると、「C:\ Program Files(x86)」が返されます。64ビットアプリケーションから同じ呼び出しが使用された場合、「C:\ProgramFiles」が返されます。 32ビットアプリケーションからのその「C:\ ProgramFiles」?
ここでの関連する質問は、SHGetFolderPath()32ビットと64ビットのどちらにも役立ちません。また、SHGetSpecialFolderPathを呼び出す前にwow64ファイルシステムのリダイレクトを抑制しません。
registry - C++ で RegDeleteKeyEx を使用せずに Windows x64 の 64 ビット ツリーでレジストリ エントリを削除するにはどうすればよいですか?
私は、Win XP 以上の環境で実行する必要がある 32 インストーラーに取り組んでいます。Windows 2k3 x64 のレジストリの x64 セクションにあるレジストリ エントリを削除しなければならないという問題があります。
これは RegDeleteKeyEx を使えば簡単ですが、Windows XP では実行できないため、その関数を呼び出す可能性のある実行可能ファイルを配布することはできません。キーのハンドルは簡単に取得できますが、キーを削除する方法がわかりません。
RegDeleteKey を使用できません。これは、レジストリのリダイレクトが x64 プラットフォームでの作業を妨げてしまうためです。キーへのハンドルと空/nullサブキー文字列を渡すことができないことに腹を立てています。この API がこんなにも壊れていたとは信じられません。何か不足していますか?
現時点では、レジストリ ファイルまたは別の実行可能ファイルを呼び出してジョブを実行するという私の唯一のアイデアですが、それは信じられないほど醜いものであり、厄介な回避策をさらに悪化させるだけです。より良い方法はありますか?
c# - Windowsx64のハンドルから実行可能ファイル名を取得する
x86としてコンパイルされたac#アプリケーションがあるので、Windows7x64で32ビットアプリケーションとして実行されます。アプリケーションの実行中に、アクティブなウィンドウの実行可能ファイル名を検出する必要があります。Winodws XPでは、次のコードが正常に機能しました(アクティブなウィンドウハンドルからプロセスファイル名を取得します)。x64では、32ビットプロセスの名前のみが報告されます(返されたデータをチェックしていないため、他のプロセスのガベージが返されます)。GetForegroundWindowAPIで取得したアクティブウィンドウのハンドルを渡します。
その情報を64ビット環境で32ビットプロセスから取得できますか?ありがとう。アンドレア
windows - 64 ビット Windows 2008 上の 32 ビット cluster.exe
Perl 32 ビットで実行されるインストール プログラムがあります。このプログラムはクラスター リソースに関する情報を取得する必要があるため、(バックティックを使用して) cluster.exe を実行し、その出力を解析します。
Windows Server 2003 では、32 ビット バージョンの cluster.exe が syswow64 の下に存在していたため、これはうまくいきました。ただし、そのような 32 ビット バージョンは Windows Server 2008 には存在しないため、32 ビット プロセスは syswow64 の下で検索するため、cluster.exe のバッククォート実行では、そのような実行可能ファイルが見つからないことが示されます。
この問題を回避してクラスタ リソース情報を取得する方法を誰か考えてくれませんか? 手動で行う方法の 1 つは、system32 から 64 ビット バージョンの cmd.exe をコピーし、それを「/c cluster.exe」で実行して、system32 の下で 64 ビット cluster.exe を起動することです。(cluster.exe をコピーしても、クラスター キャッシュが見つからないため、うまくいきません。) ただし、これは手動の回避策としてのみ有効であり、すべてのユーザーに対する解決策としては有効ではありません。
Windows で 64 ビット版の cluster.exe を起動する別の方法はありますか?
ありがとう、
破片
PS
同様の質問が1 か月前に technetで行われましたが、実際の回答は得られませんでした。
c++ - Win x64 で 32 ビット アプリケーションと 64 ビット アプリケーションの間で HWND を共有するにはどうすればよいですか?
MSDN によると、ウィンドウへのハンドル (HWND) は、プロセス間通信(MSDN)で 32 ビット アプリケーションと 64 ビット アプリケーションの間で共有できるとのことです。ただし、Win32 では HWND は 32 ビットですが、64 ビット Windows では 64 ビットです。では、ハンドルを共有するにはどうすればよいでしょうか。
同じ質問が、ミューテックス、セマフォ、ファイル ハンドルなどの名前付きオブジェクトのハンドルにも当てはまると思います。
c# - x64 および x86 アプリで共有されるレジストリへの設定の書き込み (レジストリ リダイレクトのバイパス)
Windows 7 x64 で実行されている x86 および x64 アプリケーションによって共有されるアプリケーション設定をレジストリに書き込みたいと考えています。
ベスト プラクティスは、HKEY_LOCAL_MACHINE\Software\Company\Product に保存することですが、WOW64 ではリダイレクトされます。
代わりに HKEY_LOCAL_MACHINE\System.. に書き込めますか? または、システムは他のことのために予約されていますか?
winapi - Win32プロセスがWOW64で開始しないようにするにはどうすればよいですか?
32ビット(x86)と64ビット(x64)の両方のバリアントでコンパイルおよびパッケージ化されたWin32プロセスがあります。x86バリアントを64ビットバージョンのWindows(つまり、WOW64)での実行を拒否したいのですが。
リンカフラグを設定してこれを行う方法はありますか?そうでない場合、私は何をする必要がありますか?
c# - レジストリと Wow6432Node キーの読み取り
レジストリを読み取って値を探すコードがいくつかありますが、HKEY_LOCAL_MACHINE\Software\App\
64 ビット バージョンの Windows で実行すると、値はHKEY_LOCAL_MACHINE\Software\Wow6432Node\App\
.
これにどのようにアプローチするのが最善ですか?64 ビットのインストーラーが必要ですか、それともコードを書き直して両方の場所を検出する必要がありますか?