2010-02-18 84 views
4

我一直試圖通過調用GetSystemInfo()並檢查SYSTEM_INFO結構上的lpMaximumApplicationAddress來確定系統上的3GB開關是打開還是關閉。檢測3gb開關是否以編程方式打開或關閉

沒有運氣。我認爲我做錯了什麼。

如何檢查3GB開關是否打開或不在C的Windows? 代碼表示讚賞。

謝謝

+0

lpMaximumApplicationAddress是正確的檢查。當你嘗試時會返回什麼? – Gabe 2010-02-18 22:25:22

回答

3

假設你的程序被編譯爲較大的地址,你可以簡單地調用GlobalMemoryStatusEx並檢查ullTotalVirtual領域。如果它大於2GB,並且您在32位系統上運行,則必須打開3GB標誌。

我實際上並不知道如何「正確」判斷Windows本身是32位還是64位,但如果您有32位進程,則可以調用IsWow64Process來查看您是否在64位操作系統上運行。

這一切似乎有點間接的,我知道:)

+0

對於'ullTotalVirtual',64位操作系統會報告4GB(開始時減去128k,結束時爲128k)。真的,如果ullTotalVirtual大於3 GB,那麼你知道它是一個x64操作系統。 – 2017-06-28 17:18:16

3

是你的程序IMAGE_FILE_LARGE_ADDRESS_AWARE?可以使用3-GB地址空間

http://www.microsoft.com/whdc/system/platform/server/PAE/PAEmem.mspx

可執行需要具有位IMAGE_FILE_LARGE_ADDRESS_AWARE在他們的圖像標頭中設置。如果您是可執行文件的開發人員,則可以指定鏈接器標誌(/ LARGEADDRESSAWARE)。

+0

我只需要知道它是否打開。這就是全部 – Jessica 2010-02-18 21:33:53

+0

您用來測試它的程序是否必須構建/ LARGEADDRESSAWARE。是嗎? – 2010-02-18 21:42:04

+0

謝謝。 我會再問一次:有沒有辦法通過代碼知道3gb開關是ON還是OFF?如果是的話,你知道如何做到這一點?不管該標誌是否設置。 – Jessica 2010-02-18 21:43:49

2

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上進行測試。

相關問題