Cmd Parameterübergabe an WinMain



  • Hallo!

    Kann mir jemand verraten wie ich an Parameter, die beim Programmaufruf übergeben werden, in einer Windows Anwendung heran komm? Also unter WinMain()?
    Muss ich WinMain() um Parameter am Anfang oder Ende erweitern?

    Mfg.



  • int WINAPI WinMain(
      HINSTANCE hInstance,      // handle to current instance
      HINSTANCE hPrevInstance,  // handle to previous instance
      LPSTR lpCmdLine,          // command line <--------------------
      int nCmdShow              // show state
    );
    


  • Moin, Moin...

    Die übergebene Parameterliste ist leider nicht so aufgeteilt wie in einem Konsolenprogramm mittels argv[] und argc. Es gibt eine Funktion, um die Parameterliste in ein Zeiger-Array umzuwandeln. Dummerweise gibt es diese Funktion nur in der UNICODE-Variante CommandLineToArgvW.

    Ich habe eine kleine Funktion geschrieben, mit der man eine ANSI-String-Parameterliste umwandelt. Sie ist vielleicht etwas lang und umständlich, ich glaube aber, dass sie dafür auch besser nachzuvollziehen ist.

    #include <windows.h>
    #include <string.h>
    
    TCHAR   szOutput[160],
            szTemp[80];
    
    TCHAR **cmdlinetoargv(TCHAR *szParameter, int *argc)
    {
      TCHAR   *myparam,
              *spos,
              **argv;
      int     i = 0,
              iLaenge;
    
      // Laenge der Kommandozeilenparameter
      iLaenge = strlen(szParameter);
      if(iLaenge == 0) return NULL;
    
      // Neuen Buffer anfordern
      myparam = (TCHAR *)malloc(iLaenge + 1);
      if(myparam == NULL) return NULL;
    
      // Parameter in den neuen Buffer kopieren
      // Die Originalliste lasse ich lieber unangetastet
      strcpy(myparam, szParameter);
    
      // Startadresse zum Ermitteln der Anzahl der Parameter
      spos = myparam;
    
      // Anzahl mit 0 initialisieren
      *argc = 0;
    
      // Die Anzahl der Parameter ermitteln
      // Das Trennzeichen ist Leerzeichen
      do
      {
        // Wo ist das nächste Leerzeichen
        spos = strchr(spos, ' ');
        if(spos != NULL)
        {
          // Anzahl der Parameter erhöhen
          (*argc)++;
    
          // Nächster Parameter beginnt ein Zeichen nach dem Leerzeichen
          spos++;
        }
    
      }while(spos != NULL); // Solange noch Leerzeichen gefunden werden
    
      // Anzahl = Anzahl + 1
      (*argc)++;
    
      // Feld für die Parameter-Zeiger anfordern
      argv = (TCHAR **)malloc((*argc) * 4);
    
      // spos wieder mit der Adresse des ersten Parameters initialisieren
      spos = myparam;
    
      // Erster Parameterzeiger ist Startadresse der Parameterliste
      argv[0] = myparam;
    
      do
      {
        // Nächstes Leerzeichen suchen
        spos = strchr(spos, ' ');
        if(spos != NULL)
        {
          // Leerzeichen durch /NUL(Stringende) ersetzen
          *spos = 0;
    
          // Nächster Parameter
          spos++;
    
          // Nächsten Parameterzeiger sichern
          argv[++i] = spos;
        }
    
      }
      while(spos != NULL); // Solange noch Leerzeichen gefunden werden
    
      // Adresse des Zeiger-Arrays zurückgeben
      return argv;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int iShow)
    {
      TCHAR   **argv;
      int     argc, i;
    
      wsprintf(szOutput, "Parameterliste: %s\nLaenge: %d", pCmdLine, strlen(pCmdLine));
      MessageBox(NULL, szOutput, "Parameters", MB_OK);
    
      argv = cmdlinetoargv(pCmdLine, &argc);
    
      szOutput[0] = 0;
    
      for(i = 0;i < argc;i++)
      {
        wsprintf(szTemp, "%s\n", argv[i]);
        strcat(szOutput, szTemp);
      }
    
      MessageBox(NULL, szOutput, "Parameters", MB_OK);
    
      // Unseren Buffer mit der Parameterliste freigeben!!!!!!!
      free(argv[0]);
    
      // Das Zeiger-Array wieder freigeben!!!!!!!!!
      free(argv);
    
      return 0;
    }
    

    Wichtig ist, dass die beiden Speicherblöcke, die die Funktion anfordert wieder freigegeben werden.

    Ciao...

    [ Dieser Beitrag wurde am 03.07.2003 um 13:46 Uhr von Kal El editiert. ]



  • In Visual C++ kannst du auch __argv und __argc verwenden.



  • Moin, Moin...

    @Tipp:

    Du machst Deinem Name alle Ehre. Prima Hinweis...

    Hier ein kleines Beispiel:

    #include <windows.h>
    
    extern int  __argc;
    extern char **__argv;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int iShow)
    {
      int i;
    
      wsprintf(szOutput, "Parameterliste: %s\nLaenge: %d", pCmdLine, strlen(pCmdLine));
      MessageBox(NULL, szOutput, "Parameters", MB_OK);
    
      szOutput[0] = 0;
    
      for(i = 0;i < __argc;i++)
      {
        wsprintf(szTemp, "%s\n", __argv[i]);
        strcat(szOutput, szTemp);
      }
    
      MessageBox(NULL, szOutput, "Parameters", MB_OK);
    
      return 0;
    }
    

    Ciao...


Anmelden zum Antworten