# GetCommandLine() | C WINAPI



## Wolfsbein (29. Januar 2003)

Hallo
ich will die Kommandozeile mit Parameter im Program verwenden. Mit main() ist das keine Problem, wg. den Arrays. Unter WinMain() schaff ichs aber nicht. Ich bin im Moment so weit:

```
// Kommandozeile auslesen
lpCmdLine = GetCommandLine();
```
Das ganze sollte jetzt ein Zeiger auf den Text sein. Leider auf die ganze Eingabe. Wie teile ich das jetzt sinnvoll auf, wenn man davon ausgehen kann, dass die Eingabe immmer so aussieht:
program.exe opt1 oder program.exe opt2
Sorry bin in dem Gebiet absoluter Noob.


----------



## Daniel Toplak (30. Januar 2003)

Also laut MSDN verwendet man die Funktion GetCommandLine() nur um den einen korrekten Unicode-String zu erhalten.
Wenn du das nicht brauchst, dann verwende doch einfach den Parameter der WinMain:

```
int WINAPI WinMain(
  HINSTANCE hInstance,  // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,      // pointer to command line
  int nCmdShow          // show state of window
);
```

int lpCmdLine steht die Kommandozeile OHNE Applikation drin
Zitat MSDN:


> lpCmdLine
> Pointer to a null-terminated string specifying the command line for the application, excluding the program name. To retrieve the entire command line, use theGetCommandLine function.



Gruss Homer


----------



## goela (30. Januar 2003)

Mit der angehängten Klasse kannst Du die einzelnen Parameter aus der Kommandozeile bequem auslesen.

Die Beschreibung zu der Klasse findest Du hier.

Willst Du die Klasse nicht verwenden, so kannst Du aber immerhin Stücke aus dem Quellcode verwenden oder zumindest schauen, wie man die Kommandozeile ausliest und die Parameter extrahiert.


----------



## Wolfsbein (30. Januar 2003)

Vielen Dank euch beiden. Damit werde ich wohl weiterkommen.


----------



## Wolfsbein (30. Januar 2003)

Also so recht komme ich doch nicht weiter. Liegt daran, dass ich in C nicht fit bin.

```
LPSTR line; // Hier muss ich wohl anders definieren?
// Haut hin
line = lpCmdLine; // Aber wie mache ich dann diese Zuweisung
	if(strlen(line) < 1)
	{
		MessageBox(NULL,"Sie müssen einen Parameter angeben.","Achtung Parameter!",MB_OK);
		return 0;
	}
// Haut nicht hin
if(line == 'do'){
/*
error C2446: '==' : Keine Konvertierung von 'const int' in 'char *' */
```
Kurz und gut, ich komme mit den Typen ins schleudern. Wie kann ich jetzt überprüfen, was in der Konsole noch eingegeben wurde?


----------



## Daniel Toplak (31. Januar 2003)

Also das liegt daran, das LPSTR eigentlich nur eine andere Bezeichnug für char* ist, also ein Zeiger auf ein nullterminiertes char-Array.


> line == 'do'


Was du hier machen willst (das sind übrigens gleich 2 Fehler) du willst die Anfangsadresse des char-Arrays (line) mit den 2 Zeichen vergleichen. Wobei die zwei Zeichen eigentlich in "" gehören, aber das ist ein anders Thema.
Was du jetzt machen solltest, du solltest das char-Array in einen "echten" String-Datentyp umwandeln, da ich aber nicht weiß welche Klassen Bibliothek du verwendest, kann ich dir auch net sagen in welchen Datentyp (es gibt da einige Möglichkeiten (CString, std::string, ...).
Ich kann dir nur mal ein Beispiel an Hand der STL schreiben:

```
#include <string>     // für den string
using namespace std;  // für Symbole aus der STL

string line = lpCmdLine; // Zuweisung an std::string
if(!line->size())
{
  // wenn kein paramter übergeben wurde
  MessageBox(NULL,"Sie müssen einen Parameter angeben.","Achtung Parameter!",MB_OK);
	return 0;
}
if(line.compare("do") == 0)
{
  // wenn die Commandozeile gleich "do" ist dann ....
}
```

Das ist natürlich nur eine Möglichkeit, die auf dem STRING der STL basiert.

Gruss Homer


----------



## Wolfsbein (31. Januar 2003)

Danke jetzt gehts. Ich habe es selber schon mit CString versucht, aber da das ja MFC ist, konnte ich diese Klasse nicht verwenden. 
Ein kleiner Fehler ist in deinem Beispiel : Es muss heißen line.size(). Der -> Operator ist hier nicht erlaubt.


----------



## Daniel Toplak (31. Januar 2003)

Sorry, hast natürlich recht, das war ein Versehen.

Gruss Homer


----------

