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...