Fragen zu Win32 vs. VS Wizard

11/05/2008 - 13:03 von Thomas Steinbach | Report spam
Hallo NG,

wenn ich mit Visual Studio eine Standard Win32
Anwendung erstelle dann wird z.B. der Programm-
einstiegspunk als:

int APIENTRY _tWinMain(...)

statt dem typischen

int WINAPI WinMain(...)

deklariert. Das ich oft in Tutorials entdecke.
Welchen Vorteil bringt das denn, bzw. was ist da der
Unterschied?

Thomas
 

Lesen sie die antworten

#1 Markus Schaaf
11/05/2008 - 19:11 | Warnen spam
Thomas Steinbach schrieb:

wenn ich mit Visual Studio eine Standard Win32
Anwendung erstelle dann wird z.B. der Programm-
einstiegspunk als:

int APIENTRY _tWinMain(...)

statt dem typischen

int WINAPI WinMain(...)

deklariert. Das ich oft in Tutorials entdecke.
Welchen Vorteil bringt das denn, bzw. was ist da der
Unterschied?



Unter modernen Windows-Systemen werden alle Zeichenketten die
"internationalisierbar" sind durch den Typ `WCHAR*` (entspricht
`LPWSTR`) dargestellt. Um Kompatibilitàt zu alten Programmen
herzustellen, bietet das Win32-API auch Wrapper-Funktionen für
8-Bit-Zeichenketten (Typen `CHAR*` oder `LPSTR`), welche die
übergebenen Zeichenketten konvertieren und dann die modernere
Version aufrufen.

Wenn Du in eine anstàndige Dokumentation schaust, wirst Du
feststellen, dass alle Funktionen die internationalisierbare
Zeichenketten als Parameter nehmen oder zurückgeben die Typen
`TCHAR`, `LPTSTR` oder die konstanten Variationen davon benutzen.
`TCHAR` usw. sind "magische" Bezeichner, die in Abhàngigkeit vom
Pràprozessorsymbol `_UNICODE` den Typen `CHAR` usw. oder `WCHAR`
usw. entsprechen. Außerdem werden die Bezeichner der Funktionen
auf die passende Variante "umgebogen". So wird aus `CreateFile`
etwa `CreateFileA` (die 8-Bit-kompatible Version) oder
`CreateFileW` (die neue Version für Unicode).

Die Idee dieses ganzen Makro-Theaters war, die Entwicklung von
C-Programmen zu vereinfachen, welche sowohl für moderne als auch
für alte Windows-Varianten übersetzt werden sollen. Damit man das
auch überall so durchziehen kann, wurden passende
"Überlagerungen" auch für die Funktionen der C-Laufzeitbibliothek
eingeführt. Die beginnen mit einem Unterstrich und haben irgendwo
ein "t" im Namen, z.B. `_tfopen` statt `fopen` usw. -- Die
Benennung folgt jedoch keinem verstàndlichen System, man muss oft
in den passenden Header schauen, nàmlich <tchar.h>. Dieser ist
immer einzubinden, wenn man von den `_UNICODE`-Tricks
gebrauchmachen möchte.

Das ist alles eine stark vereinfachte Darstellung: <tchar.h>
enthàlt noch andere Dinge, die jedoch eher im fernöstlichen
Sprachraum Bedeutung hatten, vor der Einführung von Unicode.

Nun zu `WinMain`. Das gehört zur C-Laufzeitbibliothek und folgt
auch deren Namensregeln. Einen zwingenden Grund dafür gàbe es
jedoch nicht.

Nochwas: "Tutorials" und selbst Microsoft(!)-Beispielcode sind
oft keine gute Studiengrundlage. Am besten ist, aktuelle
Dokumentation zu lesen. Im MSDN gibt es nicht nur reine
API-Beschreibungen, sondern auch sehr gute technische Artikel,
die eher lehrbuchartig in ein Thema einführen.

Achso: Wenn Du Deine Programme mit MinGW übersetzen möchtest,
solltest Du auf `wWinMain` (und folglich auch `_tWinMain`)
verzichten. Der Rest des Programms kann trotzdem die
<tchar.h>-Features benutzen, nur die Komanndozeile muss man sich
z.B. mit `GetCommandLine` selbst holen.

MfG

Ähnliche fragen