我一直試圖通過調用GetSystemInfo()並檢查SYSTEM_INFO結構上的lpMaximumApplicationAddress來確定系統上的3GB開關是打開還是關閉。檢測3gb開關是否以編程方式打開或關閉
沒有運氣。我認爲我做錯了什麼。
如何檢查3GB開關是否打開或不在C的Windows? 代碼表示讚賞。
謝謝
我一直試圖通過調用GetSystemInfo()並檢查SYSTEM_INFO結構上的lpMaximumApplicationAddress來確定系統上的3GB開關是打開還是關閉。檢測3gb開關是否以編程方式打開或關閉
沒有運氣。我認爲我做錯了什麼。
如何檢查3GB開關是否打開或不在C的Windows? 代碼表示讚賞。
謝謝
假設你的程序被編譯爲較大的地址,你可以簡單地調用GlobalMemoryStatusEx
並檢查ullTotalVirtual
領域。如果它大於2GB,並且您在32位系統上運行,則必須打開3GB標誌。
我實際上並不知道如何「正確」判斷Windows本身是32位還是64位,但如果您有32位進程,則可以調用IsWow64Process
來查看您是否在64位操作系統上運行。
這一切似乎有點間接的,我知道:)
對於'ullTotalVirtual',64位操作系統會報告4GB(開始時減去128k,結束時爲128k)。真的,如果ullTotalVirtual大於3 GB,那麼你知道它是一個x64操作系統。 – 2017-06-28 17:18:16
是你的程序IMAGE_FILE_LARGE_ADDRESS_AWARE?可以使用3-GB地址空間
http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx
可執行需要具有位IMAGE_FILE_LARGE_ADDRESS_AWARE在他們的圖像標頭中設置。如果您是可執行文件的開發人員,則可以指定鏈接器標誌(/ LARGEADDRESSAWARE)。
FWIW,我已經能夠使用下面的代碼做檢測(發現here):
if (!isWow64())
{
BOOL b3GBSwitch = FALSE;
SYSTEM_INFO siSysInfo;
GetSystemInfo(&siSysInfo);
b3GBSwitch = ((DWORD)siSysInfo.lpMaximumApplicationAddress & 0x80000000) != 0;
printf("3GB Switch Enabled: %d\n", b3GBSwitch);
}
的代碼被執行在的過程中不是 LARGEADDRESSAWARE。
到目前爲止,我已經能夠在Xp x86,Vista x86和Seven x64上進行測試。
lpMaximumApplicationAddress是正確的檢查。當你嘗試時會返回什麼? – Gabe 2010-02-18 22:25:22