Determiner si windows 32/64 bits en C (ou existence repertoire)
Résolu/Fermé
aiglenoirdu29
Messages postés
10205
Date d'inscription
mercredi 24 décembre 2008
Statut
Contributeur
Dernière intervention
5 mai 2020
-
Modifié par aiglenoirdu29 le 30/06/2015 à 16:38
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 2 juil. 2015 à 20:08
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 2 juil. 2015 à 20:08
A voir également:
- Determiner si windows 32/64 bits en C (ou existence repertoire)
- Winrar 64 bits windows 10 - Télécharger - Compression & Décompression
- 32 ou 64 bits - Guide
- Télécharger windows 7 32 bits usb - Télécharger - Systèmes d'exploitation
- Clé windows 10 pro 64 bits gratuit - Guide
- Word gratuit windows 7 32 bits - Télécharger - Traitement de texte
4 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
30 juin 2015 à 23:08
30 juin 2015 à 23:08
Bonjour,
Cela dépend de ton compilateur, mais tu peux utiliser :
Note : ce n'est pas terrible system()... Utilise plutôt execve().
Cdlt,
Cela dépend de ton compilateur, mais tu peux utiliser :
#if defined(_WIN32) ... #elif defined(_WIN64) ... #endif
Note : ce n'est pas terrible system()... Utilise plutôt execve().
Cdlt,
YCN-
Messages postés
116
Date d'inscription
mercredi 24 juin 2015
Statut
Membre
Dernière intervention
13 juillet 2017
12
1 juil. 2015 à 10:09
1 juil. 2015 à 10:09
Du batch serait beaucoup plus approprié, tu as une command IF EXIST ( instruction), c'est magnifique pour ce genre de choses.
aiglenoirdu29
Messages postés
10205
Date d'inscription
mercredi 24 décembre 2008
Statut
Contributeur
Dernière intervention
5 mai 2020
2 346
1 juil. 2015 à 10:47
1 juil. 2015 à 10:47
Bonjour YCN-,
j'avais effectivement utilisé IF EXIST pour la première version qui était en batch.
Mais programme complet utilise des structures de données non disponibles en batch (pile d'exécution, gestion de fichiers de données et rapports...).
Sans compter qu'en batch ça commençait vraiment a ne plus ressembler à rien dès qu'on dépasse les 100 lignes de code donc je me suis retourné vers le C que je connais un peu et où je peux sans soucis faire des tas de fonctions et d'appels en séparant tout ça proprement et surtout lisiblement.
j'avais effectivement utilisé IF EXIST pour la première version qui était en batch.
Mais programme complet utilise des structures de données non disponibles en batch (pile d'exécution, gestion de fichiers de données et rapports...).
Sans compter qu'en batch ça commençait vraiment a ne plus ressembler à rien dès qu'on dépasse les 100 lignes de code donc je me suis retourné vers le C que je connais un peu et où je peux sans soucis faire des tas de fonctions et d'appels en séparant tout ça proprement et surtout lisiblement.
YCN-
Messages postés
116
Date d'inscription
mercredi 24 juin 2015
Statut
Membre
Dernière intervention
13 juillet 2017
12
1 juil. 2015 à 13:38
1 juil. 2015 à 13:38
J'ai peut être une solution, tu peux peut être appeler un simple batch et lui demander de te retourner un booléen en fonction de si oui ou non le fichier existe. Cependant je ne suis pas un expert en batch alors je ne saurais pas trop comment récupérer le booléen en sortie du batch puis l'utiliser dans ton code C, en revanche je suis convaincu que ça doit être possible. Si c'est la solution que tu te décide à employer, je veux bien savoir comment tu auras fait pour "attraper" le bool en sortie de batch !
Cordialement,
Cordialement,
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
1 juil. 2015 à 14:30
1 juil. 2015 à 14:30
Nan, mais faut oublier la solution du batch... C'est une très mauvaise pratique d'appeler les batchs à partir du C. C'est souvent non portable, non sécuritaire, non performant.
Pour tester l'existence d'un répertoire en C, il y a la fonction POSIX opendir() ou même des API Windows()...
Pour tester l'existence d'un répertoire en C, il y a la fonction POSIX opendir() ou même des API Windows()...
YCN-
Messages postés
116
Date d'inscription
mercredi 24 juin 2015
Statut
Membre
Dernière intervention
13 juillet 2017
12
1 juil. 2015 à 14:45
1 juil. 2015 à 14:45
Hm certainement, c'est claire que c'était hyper bricolé ! Mais j'aurais bien aimer cependant savoir comment faire cette interface batch/C, afin de pouvoir récupérer les sorties d'un batch dans mon programme en C. Cad les utiliser tout comme des fonction qui retourne des int/float/char... J'aimerais beaucoup savoir faire ça, ça me permettrait d'organiser un peu mieux mes batch en les appelant d'un programme en C.
aiglenoirdu29
Messages postés
10205
Date d'inscription
mercredi 24 décembre 2008
Statut
Contributeur
Dernière intervention
5 mai 2020
2 346
Modifié par aiglenoirdu29 le 1/07/2015 à 21:41
Modifié par aiglenoirdu29 le 1/07/2015 à 21:41
Arf wProcessorArchitecture ça ne résout pas mon soucis, si le processeur est en 64 bits mais que l'os installé est en 32 bits alors il me dira comme réponse 64bits... alors que la vrai réponse est 32.
Du coup j'ai fais avec opendir et ça marche très bien, code ajouté dans mon programme :
Merci encore à tous !
Source : Stackoverflow.com
Du coup j'ai fais avec opendir et ça marche très bien, code ajouté dans mon programme :
#include <dirent.h>
[...]
struct dirent *pDirent;
DIR *pDir;
pDir = opendir ("C:/Program Files (x86)/");
if (pDir == NULL) {return 32;} else {return 64;}
[...]
Merci encore à tous !
Source : Stackoverflow.com
aiglenoirdu29
Messages postés
10205
Date d'inscription
mercredi 24 décembre 2008
Statut
Contributeur
Dernière intervention
5 mai 2020
2 346
Modifié par aiglenoirdu29 le 2/07/2015 à 11:37
Modifié par aiglenoirdu29 le 2/07/2015 à 11:37
Le struct dirent *pDirent; est inutile, code corrigé :
#include <dirent.h>
[...]
int OSx64()
{
DIR *pDir;
pDir = opendir ("C:/Program Files (x86)/");
if (pDir == NULL) {return 32;} else {return 64;}
}
[...]
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
2 juil. 2015 à 20:08
2 juil. 2015 à 20:08
Bonsoir
Je ne pense pas que le fait de tester l'existence d'un répertoire sur un système donné puisse définir l'environnement de plus, ce teste ne fait qu'affirmer la séparation des exécutables de types 32 et 64.
Là où je pense qu'il faudrait jouer de manière astucieuse est sur les informations d'environnement sur lequel l'exécutable tourne (et le père a raison) de ce fait on peut exécuter certaines instructions pour l'environnement sur lequel l'exécutable s'exécute et aussi mettre de côté le bash.
à bientôt
Je ne pense pas que le fait de tester l'existence d'un répertoire sur un système donné puisse définir l'environnement de plus, ce teste ne fait qu'affirmer la séparation des exécutables de types 32 et 64.
Là où je pense qu'il faudrait jouer de manière astucieuse est sur les informations d'environnement sur lequel l'exécutable tourne (et le père a raison) de ce fait on peut exécuter certaines instructions pour l'environnement sur lequel l'exécutable s'exécute et aussi mettre de côté le bash.
/* Windows */ #if _WIN64 #define CPU_ARCHI 64 #include <stdint.h> #else #define CPU_ARCHI 32 #include <stdint.h> #endif /* Linux */ #if __LP64 || _LP64 #define CPU_ARCHI 64 #include <stdint.h> #else #define CPU_ARCHI 32 #include <stdint.h> #endif /* Contrôle max entier */ #if INTPTR_MAX == INT64_MAX #define INT_ARCHI 64 #elif INTPTR_MAX == INT32_MAX #define INT_ARCHI 32 #else #define INT_ARCHI 0 #endif /* Autre constante de teste */ #define _CHECK_OS_ARCHI_ fprintf( stdout, "OS\t:%d\n",CPU_ARCHI ); #define _CHECK_INT_OS_ARCH_ fprintf( stdout,"INT OS\t:%d\n", INT_ARCHI ); #define _VALUE_INT (INTPTR_MAX == INT64_MAX) ? INT64_MAX\ : (INTPTR_MAX == INT32_MAX) ? INT32_MAX : INTPTR_MAX #define _GET_ARCHI_INFO_INT fprintf( stdout,"INT\t:%ld\n", _VALUE_INT ); #include <stdio.h> /* Autre exemple utilisation func*/ int f_is_32_or_64( void ){ return ( INT_ARCHI == CPU_ARCHI) ? CPU_ARCHI : INT_ARCHI; } int main( void ){ _CHECK_OS_ARCHI_; _CHECK_INT_OS_ARCH_; _GET_ARCHI_INFO_INT; if( CPU_ARCHI != f_is_32_or_64() ) printf("Erreur environement"); else printf("OS%d\n", CPU_ARCHI ); return 0; }
à bientôt
30 juin 2015 à 23:25
Ça ne va pas le renseigner sur la machine sur laquelle a tourné le compilateur, plutôt que sur celle sur laquelle tourne l'exécutable ?
Modifié par fiddy le 30/06/2015 à 23:53
A voir ce qu'il souhaite.
S'il souhaite le déterminer dynamiquement, il suffit d'utiliser l'API Win32 GetSystemInfo qui renvoie une structure SYSTEM_INFO. Le champ wProcessorArchitecture contiendra l'information recherchée.
Cdlt,
1 juil. 2015 à 11:01
Je vais de ce pas voir pour GetSystemInfo !
Je regarderais également execve que je ne connais pas, j'utilise system par habitude.
Modifié par fiddy le 1/07/2015 à 11:20