2009-01-14 152 views
14

我需要去本地(而不是WOW)的32位WOW處理程序的文件目錄的路徑。如何從32位WOW進程獲取Program Files文件夾路徑(不是Program Files(x86))?

當我將CSIDL_PROGRAM_FILES(或CSIDL_PROGRAM_FILESX86)傳遞到SHGetSpecialFolderPath時,它將返回WOW(Program Files(x86))文件夾路徑。

我寧願避免使用如果可能的環境變量。

我想比較的一些值我從註冊表中讀取,如果數值指向的我的應用程序無論是WOW或本地版本的路徑,然後我的代碼做一些事情,如果沒有它別的東西。 要找出其中的本地和WOW我的應用程序的版本預計將我需要的路徑爲「程序文件(x86)」和「程序文件」。

+0

你不應該依賴於你的程序 「預計」。應用程序是用戶想要它們的地方。小型SSD越來越受歡迎,它們將爲許多PC增加額外的安裝位置。 – MSalters 2009-01-15 15:29:39

+0

完全,但在這種情況下,它確實會在程序文件文件夾中。 – 2009-01-17 01:10:28

+0

對我來說,爲什麼要更新Chrome的擴展列表,這可能在AppData,Program Files(x86)或Program Files中。 (當然,Program Files的名字可能是別的。) – tofutim 2011-09-20 20:57:49

回答

21

我欣賞所有的幫助,尤其是在這個線程中的警告。不過,我真的需要這條道路,這是我到底怎麼得到它:

(檢查刪除錯誤的清晰度,使用您自己的風險,等等)

WCHAR szNativeProgramFilesFolder[MAX_PATH]; 
ExpandEnvironmentStrings(L"%ProgramW6432%", 
         szNativeProgramFilesFolder, 
         ARRAYSIZE(szNativeProgramFilesFolder); 
12

讓我引用雷蒙德陳在這個問題上的excellent blogpost

在64位Windows,32位程序運行在仿真層 。此仿真 層模擬x86架構, 虛擬化CPU,文件系統, 註冊表,環境 變量,系統信息 函數,所有的東西。如果一個32位 程序嘗試一下系統, 它會看到一個32位系統。對於 例如,如果程序調用 的GetSystemInfo函數來看看有什麼 處理器運行時,它會被告知 ,它的上一個32位 處理器上運行,以32位地址 空間,在這個世界上,一個32位天空 和32位樹中的32位鳥類。

而這就是仿真的要點: 保持32位程序開心 模擬32位執行 環境。

...

的問題是「什麼是 從32位應用程序找到64位程序文件目錄 的方式?」

答案是「這是更好地與系統不是反對它的工作 。」如果 你是一個32位程序,那麼你 將要對抗每次 模擬器您嘗試與外界交互 。相反,只是 重新編譯安裝程序爲64位 程序。讓32位安裝程序 檢測到它在64位的 系統上運行,而是啓動64位安裝程序 。 64位安裝程序不會 運行在32位仿真層,所以 當它試圖複製文件或更新 註冊表項時,它會看到真正的 64位文件系統和真正的64位 註冊表。

如果你還想這樣做,我建議閱讀這篇博文的評論,因爲它們包含一些很好的提示。

+0

從32b程序獲取64b ProgFiles的一個完全合法的用例是當它試圖備份你的計算機,但是想忽略程序文件。當然你也想忽略64b Program Files文件夾。 – 2014-03-20 03:47:18

3

你是在正確的道路上 - 使用FOLDERID_ProgramFilesX64

SHGetKnownFolderPath功能KNOWNFOLDERID可以用來獲取給定KnownFolder的完整路徑。

+2

是不是隻適用於Vista或更高版本? codde在Vista之前稱之爲Windows的時候會發生什麼? – paxdiablo 2009-01-15 00:41:09

1

根據臭名昭着的Raymond Chen最近的一篇文章,這幾乎肯定是一個壞主意。詳情請參閱here。底線,我認爲這是可以做到的,但這是一項艱苦的工作,而且幾乎肯定有一種更簡單的方法。

微軟構建了WOW仿真層,讓您的生活更輕鬆。不要浪費他們所有的時間和精力:-)。

也許如果你告訴我們爲什麼你需要非WOW Program Files目錄,我們可以進一步提供幫助。

1

我需要它來獲得從Logonscript的64位程序文件夾,使用:

Dim oWshShell : Set oWshShell = CreateObject("WScript.Shell") 
Dim sProgramDirPath : sProgramDirPath = 
    oWshShell.ExpandEnvironmentStrings("%ProgramW6432%") 

WScript.Echo sProgramDirPath 
-2

最好的和通用的方式來獲得路徑「程序文件」,是從註冊表查詢它:

64位進程可以查詢: HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \ ProgramFilesDir的 獲得 「C:\ Program Files文件」 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微軟\的Windows \ CurrentVersion \ ProgramFilesDir的 獲得「C:\程序文件(x86)」

32位進程(WOW64)可以查詢: HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows \ CurrentVersion \ ProgramFilesDir的 獲得 「C:\ Program Files文件(x86)的」 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ProgramFilesDirKEY_WOW64_64KEY選項! 獲得 「C:\ Program Files文件」

僞代碼:

OpenKey(hKey, HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", KEY_READ | KEY_WOW64_64KEY); 
QueryStringValue(hKey, L"ProgramFilesDir", sValue); 
相關問題