Compiler avec cl et visual studio

Résolu
bourineur Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 6 juin 2011 - 4 juin 2011 à 22:51
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 19 juin 2011 à 11:37
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

bourineur Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 6 juin 2011
6 juin 2011 à 00:38
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.
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 juin 2011 à 15:08
salut,

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

@++
0
bourineur Messages postés 5 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 6 juin 2011
6 juin 2011 à 00:44
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.
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
6 juin 2011 à 02:42
re,

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

@++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
6 juin 2011 à 02:58
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";
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 juin 2011 à 09:31
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++
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
19 juin 2011 à 11:37
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";
0
Rejoignez-nous