Paramètre lpCmdLine (WINAPI WinMain)

Résolu
_michel Messages postés 77 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 12 août 2010 - 11 juil. 2006 à 18:31
_michel Messages postés 77 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 12 août 2010 - 19 juil. 2006 à 13:45
J'ai un problème avec le paramètre lpCmdLine, défini dans WinMain :

int WINAPI WinMain  
(               
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
->LPSTR lpCmdLine,<-
  int nCmdShow
)

Mon aide Windows me spécifie que cet argument pointe sur la ligne de commande du programme, pourtant je n'obtient rien.
Un programmeur plus expérimenté que moi saurait-il comment obtenir la ligne de commande?

17 réponses

cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
11 juil. 2006 à 19:14
GetCommandLine ferait-il l'affaire par hasard ?

ULARGE_INTEGERJokyQi=QI("Joky"
3
cs_saifer Messages postés 115 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 19 décembre 2008 1
11 juil. 2006 à 19:44
Salut,
lpCmdLine pointe sur une chaine de caractère qui est les argument passé au programme.
Ex : si ton prog s'appelle prog.exe, et que tu le lance avec la commande : "chemin\prog.exe argument1 argument2", alors lpCmdLine contiendra "argument1 argument2".
<hr size="2" width="100%" />-{ Saifer }-
0
_michel Messages postés 77 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 12 août 2010
11 juil. 2006 à 21:45
Merci, GetCommandLine marche à merveille, et mon programme aussi, même si je n'ai pas compris pourquoi lpCmdLine n'arrive pas à pointer sur une chaine.
0
Utilisateur anonyme
12 juil. 2006 à 07:09
Mais tu es boucher ou quoi ???!!!
Saifer te la dit !!!

MaLaDeDeDe 97one 
0

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

Posez votre question
cs_saifer Messages postés 115 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 19 décembre 2008 1
12 juil. 2006 à 14:19
merci maladedede ! un instant j'ai cru que j'avais parlé dans le vide ! lol ^^

<hr width="100%" size="2" />
-{ Saifer }-
0
Utilisateur anonyme
12 juil. 2006 à 19:18
looooooool
MaLaDeDeDe 97one 
0
_michel Messages postés 77 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 12 août 2010
16 juil. 2006 à 14:14
Ok, ok, toutes mes excuses...
Le problème, c'est que malgré les indications si logiques qu'elles soient de Saifer, ça marche quand même pas de cette façon.
J'ai simplifié le code, et ça donne :


#include <windows.h>
#include <stdio.h>



int WINAPI WinMain
(
  HINSTANCE hInstance,
  HINSTANCE hPrevInstance,
  LPSTR lpCmdLine,
  int nCmdShow
)
{
  printf("Ligne de commande : %s\n", lpCmdLine);
  return(0);
}


Quand j'execute avec "main blabla", ça ne m'affiche rien.
Je pense que c'est le format qui n'est pas bon (LPSTR).
0
Utilisateur anonyme
16 juil. 2006 à 17:34
Bein ou est le probleme ce que tu as écrit c'est ce que saifer t'a dit

si tu utilise int main(int argc, char *argv[]);

Bein la LPSTR lpCmdLine ne sert a rien.
Avec main le pointeur vers des char argv fonction comme cela:
argv[0]="argument 1"
argv[1]="argument 2"
et int argc contient le nombre d'argument transmit.

Je m' y connait pas trop dedans alors si j'ai une erreur dite le vite^^ lol
++
MaLaDeDeDe 97one 
0
_michel Messages postés 77 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 12 août 2010
17 juil. 2006 à 12:21
En effet, c'est tout à fait exact, tu as dit une erreur :
Si j'utilise une WinMain, c'est pour pouvoir faire une API Windows. La différence avec une autre application : On n'a pas besoin d'une fenêtre MS-DOS a coté. Si j'utilise argc et **argv, comme je fait d'habitude, le compilateur peut pas la reconnaitre comme une WinMain et donc pas d'API Windows.
0
Utilisateur anonyme
17 juil. 2006 à 16:04
C'est toi qui dit une grosse erreur la.
argc et **argv ne s'utilise qu'avec main on est d'accord.
Mais "main" n'empaiche pas l'utilisation de l'API windows surement pas.
Tu peux creer une fenetre windows a coté de celle du dos........
Et puis je ne parlaispas de ca je parlais de la facon de récupéré les argument de la ligne de commande.....alalal

MaLaDeDeDe 97one 
0
_michel Messages postés 77 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 12 août 2010
18 juil. 2006 à 14:22
Ok, trouve moi une facon de récuperer la ligne de commande avec lpCmdLine...

 
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
18 juil. 2006 à 14:30
#include <windows.h>

void GetCmdLine(LPSTR cmdLine, char *szOut)
{
       char *d = szOut;
      
       while(*cmdLine)
           *d++ = *cmdLine++;
          
      *d = 0;
}
      
int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int iShow)
{
      char CommandLine[255];
      
      GetCmdLine(lpCmdLine, CommandLine);
      
      MessageBox(0, CommandLine, "Ligne de Commande", 0x40);
      
      return 0;
}

ULARGE_INTEGERJokyQi=QI("Joky"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
18 juil. 2006 à 14:38
le problème c'est que saifer te raconte n'importe quoi :(
LPSTR = long pointer sur string
Donc ce n'est que adresse
Il ne contiendra donc jamais : "argument1 argument2"

Par contre *lpCmdLine contiendra 'a'
etc...
ULARGE_INTEGERJokyQi=QI("Joky"
0
Utilisateur anonyme
18 juil. 2006 à 16:19
#include <windows.h>
#include <stdio.h>


int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)


{
                    printf("%s",lpszArgument);
}

Meme si c'est un pointeur ca change pas grand chose parceque les chaines de caractaires sont toujours passé par référence.
( Lors de la transmition de la chaine a une fonction, seul un pointeur vers le premier caractaire sera passé).

MaLaDeDeDe 97one 
0
cs_saifer Messages postés 115 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 19 décembre 2008 1
18 juil. 2006 à 18:16
En effet Joky, je me suis mal exprimé, je voulais dire "que *lpCmdLine pointera vers la première lettre de la chaîne de caractères qui représente les arguements passer au programme".
Dsl, mais je pensais qu'a peu de chose près...

<hr width="100%" size="2" />
-{ Saifer }-
0
Utilisateur anonyme
18 juil. 2006 à 19:19
Non ce que tu as dit SAIFER c'est vrai.
Ca pointe bien sur la chaine de caractaire donc forcement le debut de la chaine donc le premier caractaire.

MaLaDeDeDe 97one 
0
_michel Messages postés 77 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 12 août 2010
19 juil. 2006 à 13:45
Euréka!
En fait, je pigeais pas pourquoi j'arrivait pas à trouver la ligne de commande en l'affichant avec printf.
Mais cette fonction ne marche pas avec les API Windows, à moins de changer la sortie standard.
Donc j'avais bien la ligne, mais elle s'affichait dans le vide.
En affichant une MessageBox, on résoud le problème, il y a même pas besion de copier lpCmdLine dans une autre chaine.
0
Rejoignez-nous