Compiler avec cl et visual studio

Résolu
Signaler
Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
6 juin 2011
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour, cela fait à peine quelques mois que j'ai commencé la programmation, et je me retrouve face à un problème en compilant sous windows avec microsoft visual studio.

Voila mon code :

#include <Windows.h>

void main () {
HINSTANCE error;

error=ShellExecute(NULL,(LPCWSTR)"open",(LPCWSTR)"c:\\prog\\PRog.exe",NULL,(LPCWSTR)"c:\\prog",SW_SHOWNORMAL};

if (error < 32) {
printf("%d\n",error);
}
}

Donc en le compilant avec la commande "cl main.c", le programme fonctionne correctement (lance prog.exe), mais en le compilant avec un projet visual studio il m'affiche le nombre 2, qui correspond au chemin du fichier non trouvé.

Je ne m'explique pas d'où viens le problème.

Si vous avez une solution, merci d'avance.

7 réponses

Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
6 juin 2011

A force de chercher, j'ai fini par trouver la solution au hasard, c'est en faite la fonction ShellExecuteA que je dois utiliser (ainsi), car la fonction ShellExecute est réservé pour l’Unicode, qui est activé par défaut dans visual studio.
La commande correcte est donc :

ShellExecuteA(NULL,(LPCSTR)"open",(LPCSTR)"c:\\prog\\PRog.exe",NULL,(LPCSTR)"c:\\prog\",SW_SHOWNORMAL};

Pour te répondre patatalo :

LPCWSTR correspond à const wchar_t *LPCWSTR (Unicode 16 bits) et LPCSTR correspond à __nullterminated const char *LPCSTR (ainsi 8 bits)

Donc je suis obligé de spécifié entre parenthèse les type pour avoir la conversion.

Au passage, __nullterminated indique que le dernier élément d'une chaine, ou d'un tableau pointe vers un pointeur contenant 0.

Donc si je met directement du char, ça ne marche pas.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

Comment se fait-il que tu sois obligé de mettre les (LPCWSTR). Comment as-tu déclaré tes variables ?

@++
Messages postés
5
Date d'inscription
jeudi 21 février 2008
Statut
Membre
Dernière intervention
6 juin 2011

Je n'avais pas lu toutes ta question patatalo :

Donc comment je déclare mes variables ?

Et ben j'en fais pas ! Je trouve qu'il n'est pas nécessaire de déclarer des char que je ne vais utiliser qu'une seule fois. Autant directement mettre la chaine de caractère tel quel.

J'aurais pu faire des variable du type :

LPCSTR toto = (LPCSTR) "c:\\prog\\PRog.exe";

Mais je pense que c'est inutile.

Merci à tous. Bonne journée.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

LPCSTR ascii = "ma chaine";
LPCWSTR unicode = (LPCWSTR) "m\0a\0 \0c\0h\0a\0i\0n\0e\0";

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
ajout d'un \0 en fin de chaine sinon, le zero final restera (char). Je ne suis pas sur que cela soit réellement nécessaire, a voir, mais c'est plus correct.

LPCWSTR unicode = (LPCWSTR) "m\0a\0 \0c\0h\0a\0i\0n\0e\0\0";
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
ShellExecute n'est réservé à rien du tout puisqu'elle n'existe pas.

C'est l'option de compil unicode ou ansi qui détermine si ShellExecute est #define de ShellExecuteA ou ShellExecuteW.

Il en va ainsi de toutes les fonctions API qui ont des parametres chaine de caractères.

ciao...
BruNews, MVP VC++
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Salut,

[quote=patatalo]LPCSTR ascii = "ma chaine";
LPCWSTR unicode = (LPCWSTR) "m\0a\0 \0c\0h\0a\0i\0n\0e\0"; /quote

Plus simple :
LPCSTR ascii = "ma chaine";
LPCWSTR unicode = L"ma chaine";