2010-02-18 5 views
4

J'ai essayé de déterminer si le commutateur 3GB est activé ou désactivé sur le système mon programme s'exécute en appelant GetSystemInfo() et en vérifiant lpMaximumApplicationAddress sur la structure SYSTEM_INFO.Détecter si le commutateur 3gb est activé ou désactivé par programmation

Pas de chance. Je pense que je fais quelque chose de mal.

Comment vérifier si le commutateur 3GB est activé ou non sous Windows dans C? Le code est apprécié.

grâce

+0

lpMaximumApplicationAddress est la bonne chose à vérifier. Qu'est-ce qui est retourné quand vous l'essayez? – Gabe

Répondre

3

En supposant que votre programme est compilé comme longues adresses, vous pouvez simplement appeler GlobalMemoryStatusEx et vérifier le champ ullTotalVirtual. Si la taille est supérieure à 2 Go et que vous utilisez un système 32 bits, l'indicateur 3 Go doit être activé.

Je ne sais vraiment pas comment dire "correctement" si Windows est nativement 32 ou 64 bits, mais si vous avez un processus 32 bits, vous pouvez appeler IsWow64Process pour voir si vous utilisez un système d'exploitation 64 bits .

Tout cela semble un peu indirecte, je sais :)

+0

Un système d'exploitation 64 bits signalerait 4 Go (moins 128k au début et 128k à la fin) pour '' ullTotalVirtual''. Vraiment si '' ullTotalVirtual'' est plus grand que 3 Go, alors vous savez que c'est un système d'exploitation x64. –

3

est votre IMAGE_FILE_LARGE_ADDRESS_AWARE du programme?

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

Exécutables qui peuvent utiliser l'espace d'adressage 3 Go doivent avoir le bit IMAGE_FILE_LARGE_ADDRESS_AWARE mis dans leur en-tête d'image. Si vous êtes le développeur de l'exécutable, vous pouvez spécifier un indicateur d'éditeur de liens (/ LARGEADDRESSAWARE).

+0

J'ai juste besoin de savoir si c'est sur ou non. c'est tout – Jessica

+0

Le programme que vous utilisez pour tester s'il est allumé doit être construit/LARGEADDRESSAWARE. est-ce? –

+0

merci. Je vais demander à nouveau: Y at-il un moyen de savoir si le commutateur 3GB est ON ou OFF par code? Si oui, savez-vous comment faire cela? peu importe si ce drapeau est défini. – Jessica

2

FWIW, j'ai été en mesure de faire la détection en utilisant le code suivant (trouvé here):

if (!isWow64()) 
{ 
    BOOL b3GBSwitch = FALSE; 
    SYSTEM_INFO siSysInfo; 
    GetSystemInfo(&siSysInfo); 
    b3GBSwitch = ((DWORD)siSysInfo.lpMaximumApplicationAddress & 0x80000000) != 0; 
    printf("3GB Switch Enabled: %d\n", b3GBSwitch); 
} 

Le code est exécuté dans un processus qui est pas LARGEADDRESSAWARE. Jusqu'à présent, j'ai pu tester sur XP x86, Vista x86 et Seven x64.

Questions connexes