32 ビット アプリケーションから 64 ビット Windows Vista 上の 64 ビット Program Files ディレクトリの場所を特定する方法の問題に苦しんでいます。
を呼び出してSHGetKnownFolderPath(FOLDERID_ProgramFilesX64)
も何も返されません。MSDNの記事KNOWNFOLDERIDにも、この特定の呼び出しFOLDERID_ProgramFilesX64
は 32 ビット アプリケーションではサポートされていないと記載されています。
「C:\Program Files」へのパスをハードコーディングすることはできるだけ避けたいと思います。のようなことGetWindowsDirectory()
をして、戻り値からドライブを抽出し、それに「\Program Files」を追加するのも魅力的ではありません。
32 ビット アプリケーションが 64 ビット Windows Vista からフォルダの場所を正しく取得するにはどうすればよいですか?
バックグラウンド
私たちのアプリケーションには、ユーザーセッション固有のコンポーネントからのリクエストに基づいて他のプロセスを起動するサービスコンポーネントがあります。起動するアプリケーションは、32 ビットまたは 64 ビットにすることができます。これはCreateProcessAsUser()
、ユーザー セッション プロセスの開始からトークンを渡すことによって行います。への呼び出しのために、 APICreateProcessAsUser
を介して環境ブロックを作成します。CreateEnvironmentBlock()
問題はCreateEnvironmentBlock()
、ユーザー セッション アプリケーションのトークンを使用して、ProgramW6432="C:\Program Files (x86)" でブロックを作成することです。これは 64 ビット アプリケーションの問題です。適切な値でオーバーライドする必要があります。