Argumente in main vs WinMain

Juli 26th, 2008 | Kategorien: C++, Microsoft | Tags: , ,

Windows macht Dinge anders. Das ist bekannt und ich bin trotzdem wieder mal reingefallen …

Standard C++ definiert die bekannte main() Funktion.

int main(int argc, char** argv)

Die Windows spezifische Version schaut so aus:

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

Ich werde hier nicht weiter auf die Unterschiede bezüglich hPrevInstance und hInstance eingehen, da weiß Google besser bescheid. Stattdessen gehe ich auf lpCmdLine und nCmdShow ein.

Wer sich an Dinge wie die STL gewöhnt, vermutet immer gerne mal wieder, dass Dinge überall gleich funktionieren. Sollten sie zwar auch, hier tun sie es aber nicht!

Ich ging in meiner Naivität davon aus, dass nCmdShow die Entsprechung für argc und lpCmdLine die Entsprechung von argv wäre. NEIN! lpCmdLine schmeisst einen Teil der Vorteile von argv weg: Es fügt die Kommandozeilen Parameter in einem einzigen String zusammen. Während argv also eher wie ein Array aus char* zu handhaben ist, wobei der Index 0 dem Pfad zum Programm entspricht, ist lpCmdLine ein einziger String aller Parameter ohne den Pfad zum Programm.

Gegenübergestellt schaut das so aus:

Kommandozeile: /usr/bin/foo -key value -foo "foo bar"
lpCmdLine: "-key value -foo \"foo bar\""
argv[0]: "/usr/bin/foo"
argv[1]: "-key"
argv[2]: "value"
argv[3]: "-foo"
argv[4]: "foo bar"
No comments yet.