Paramètre lpCmdLine (WINAPI WinMain) [Résolu]

_michel 77 Messages postés mardi 27 juin 2006Date d'inscription 12 août 2010 Dernière intervention - 11 juil. 2006 à 18:31 - Dernière réponse : _michel 77 Messages postés mardi 27 juin 2006Date d'inscription 12 août 2010 Dernière intervention
- 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?
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 11 juil. 2006 à 19:14
3
Merci
GetCommandLine ferait-il l'affaire par hasard ?

ULARGE_INTEGERJokyQi=QI("Joky"

Merci cs_Joky 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de cs_Joky
cs_saifer 116 Messages postés samedi 29 mars 2003Date d'inscription 19 décembre 2008 Dernière intervention - 11 juil. 2006 à 19:44
0
Merci
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 }-
Commenter la réponse de cs_saifer
_michel 77 Messages postés mardi 27 juin 2006Date d'inscription 12 août 2010 Dernière intervention - 11 juil. 2006 à 21:45
0
Merci
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.
Commenter la réponse de _michel
Utilisateur anonyme - 12 juil. 2006 à 07:09
0
Merci
Mais tu es boucher ou quoi ???!!!
Saifer te la dit !!!

MaLaDeDeDe 97one 
Commenter la réponse de Utilisateur anonyme
cs_saifer 116 Messages postés samedi 29 mars 2003Date d'inscription 19 décembre 2008 Dernière intervention - 12 juil. 2006 à 14:19
0
Merci
merci maladedede ! un instant j'ai cru que j'avais parlé dans le vide ! lol ^^

<hr width="100%" size="2" />
-{ Saifer }-
Commenter la réponse de cs_saifer
Utilisateur anonyme - 12 juil. 2006 à 19:18
0
Merci
looooooool
MaLaDeDeDe 97one 
Commenter la réponse de Utilisateur anonyme
_michel 77 Messages postés mardi 27 juin 2006Date d'inscription 12 août 2010 Dernière intervention - 16 juil. 2006 à 14:14
0
Merci
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).
Commenter la réponse de _michel
Utilisateur anonyme - 16 juil. 2006 à 17:34
0
Merci
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 
Commenter la réponse de Utilisateur anonyme
_michel 77 Messages postés mardi 27 juin 2006Date d'inscription 12 août 2010 Dernière intervention - 17 juil. 2006 à 12:21
0
Merci
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.
Commenter la réponse de _michel
Utilisateur anonyme - 17 juil. 2006 à 16:04
0
Merci
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 
Commenter la réponse de Utilisateur anonyme
_michel 77 Messages postés mardi 27 juin 2006Date d'inscription 12 août 2010 Dernière intervention - 18 juil. 2006 à 14:22
0
Merci
Ok, trouve moi une facon de récuperer la ligne de commande avec lpCmdLine...

 
Commenter la réponse de _michel
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 18 juil. 2006 à 14:30
0
Merci
#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"
Commenter la réponse de cs_Joky
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 18 juil. 2006 à 14:38
0
Merci
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"
Commenter la réponse de cs_Joky
Utilisateur anonyme - 18 juil. 2006 à 16:19
0
Merci
#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 
Commenter la réponse de Utilisateur anonyme
cs_saifer 116 Messages postés samedi 29 mars 2003Date d'inscription 19 décembre 2008 Dernière intervention - 18 juil. 2006 à 18:16
0
Merci
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 }-
Commenter la réponse de cs_saifer
Utilisateur anonyme - 18 juil. 2006 à 19:19
0
Merci
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 
Commenter la réponse de Utilisateur anonyme
_michel 77 Messages postés mardi 27 juin 2006Date d'inscription 12 août 2010 Dernière intervention - 19 juil. 2006 à 13:45
0
Merci
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.
Commenter la réponse de _michel

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.