Determiner si windows 32/64 bits en C (ou existence repertoire)

Résolu/Fermé
aiglenoirdu29 Messages postés 10177 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
Bonjour,

je cherche à déterminer en C si windows est en 32 ou 64 bits.

Dans mon programme C, je dois faire appel à un programme extérieur différent selon le système sur lequel je suis.

En gros
if (OSx64) {system("start %cd%/mesprogs/prog64.exe");} 
else if (OSx64) {system("start %cd%/mesprogs/prog32.exe");}

ça fait une bonne heure que je recherche des tutos sur le net et je n'ai rien trouvé qui ne soit pas une usine à gaz pas possible.

Donc j'ai changer de technique, je cherche à vérifier si le dossier "C:\Program Files (x86)\ existe, ce qui me permettrais de déterminer tout de suite que je suis en 64 bits. Mais idem rien trouvé d'extraordinaire :/

Si l'un d'entre vous a une solution simple et efficace pour l'un de ses deux soucis je lui en serais très reconnaissant :)

Windows has not detected any keyboard. Press Enter to continue.
Hu?
A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
30 juin 2015 à 23:08
Bonjour,

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,
0
Utilisateur anonyme
30 juin 2015 à 23:25
Bonjour

Ç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 ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Utilisateur anonyme
Modifié par fiddy le 30/06/2015 à 23:53
Salut le père,
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,
0
aiglenoirdu29 Messages postés 10177 Date d'inscription mercredi 24 décembre 2008 Statut Contributeur Dernière intervention 5 mai 2020 2 344
1 juil. 2015 à 11:01
Bonjour et merci pour vos réponses, effectivement ce qui m'intéresse c'est déterminer le type d'archi sur laquelle est lancée l'exécutable et non là où il est compilé.

Je vais de ce pas voir pour GetSystemInfo !

Je regarderais également execve que je ne connais pas, j'utilise system par habitude.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 1/07/2015 à 11:20
Après, si tu préfères tester l'existence d'un répertoire, tu as la fonction POSIX opendir().
0
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
Du batch serait beaucoup plus approprié, tu as une command IF EXIST ( instruction), c'est magnifique pour ce genre de choses.
0
aiglenoirdu29 Messages postés 10177 Date d'inscription mercredi 24 décembre 2008 Statut Contributeur Dernière intervention 5 mai 2020 2 344
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.
0
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
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,
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
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()...
0
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
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.
0
aiglenoirdu29 Messages postés 10177 Date d'inscription mercredi 24 décembre 2008 Statut Contributeur Dernière intervention 5 mai 2020 2 344
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 :

#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
0
aiglenoirdu29 Messages postés 10177 Date d'inscription mercredi 24 décembre 2008 Statut Contributeur Dernière intervention 5 mai 2020 2 344
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;}
}
[...]
0
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
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.
/*	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
0