Frage

Ich lerne über Win32-Programmierung und der WinMain Prototyp wie folgt aussieht:

int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

Ich war verwirrt, was diese WINAPI Kennung und gefunden wurde:

#define WINAPI      __stdcall

Was macht das? Ich bin von diesem mit etwas überhaupt nach einer Rückkehr Art verwirrt. Was ist __stdcall für? Was bedeutet es, wenn es etwas zwischen dem Rückgabetyp und Funktionsnamen ist?

War es hilfreich?

Lösung

__stdcall ist die Aufrufkonvention für die Funktion verwendet. Dies teilt dem Compiler die Regeln, die für den Aufbau der Stapel anwenden, Argumente schieben und einen Rückgabewert zu bekommen.

Es gibt eine Reihe von anderen Aufrufkonventionen, __cdecl, __thiscall, __fastcall und die wunderbar genannt __naked. __stdcall ist die Standard-Aufrufkonvention für Win32-System Anrufe.

Wikipedia umfasst die Details .

Es in erster Linie Fragen, wenn Sie eine Funktion außerhalb des Codes aufrufen (beispielsweise ein OS API) oder das Betriebssystem ruft Sie (wie es der Fall mit WinMain hier). Wenn der Compiler nicht weiß, die richtige Aufrufkonvention, dann werden Sie wahrscheinlich bekommen sehr seltsame Abstürze wie der Stapel nicht richtig verwaltet werden.

Andere Tipps

C oder C ++ selbst nicht definieren, die Identifier. Sie sind Compiler-Erweiterungen und stehen für bestimmte Aufrufkonventionen. Das legt fest, wo Argumente setzen, in welcher Reihenfolge, in der die genannten Funktion die Absender-Adresse finden, und so weiter. Zum Beispiel bedeutet __fastcall, dass die Argumente von Funktionen über Register übergeben werden.

Wikipedia Artikel bietet eine Übersicht über die verschiedenen Aufrufkonventionen da draußen gefunden.

Die Antworten wurden bisher die Details bedeckt, aber wenn Sie nicht vorhaben, nach unten bis zur Montage fallen, dann alles, was Sie wissen müssen, ist, dass sowohl der Anrufer und der Angerufene die gleiche Aufrufkonvention verwenden müssen, sonst werden Sie erhalten Fehler, die schwer zu finden sind.

Ich bin damit einverstanden, dass alle Antworten bisher korrekt sind, aber hier ist der Grund. Microsofts C und C ++ Compiler bieten verschiedene Aufrufkonventionen für (beabsichtigte) Geschwindigkeit der Funktionsaufrufe innerhalb einer Anwendung C und C ++ Funktionen. In jedem Fall muss der Anrufer und Angerufenen vereinbaren welche Aufrufkonvention zu verwenden. Nun Windows selbst bietet Funktionen (APIs), und diejenigen, die bereits erstellt worden sind, so dass, wenn Sie sie nennen müssen Sie ihnen entsprechen. Alle Anrufe auf Windows-APIs und Rückrufe von Windows-APIs, müssen die __stdcall Konvention verwenden.

Es hat damit zu tun, wie die Funktion called- ist im Grunde die Reihenfolge, in der die Dinge auf dem Stapel gelegt werden und wer ist verantwortlich für die Bereinigung.

Hier ist die Dokumentation, aber es bedeutet nicht viel, wenn Sie den ersten Teil verstehen:
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx

__ stdcall wird verwendet, um die Funktionsargumente in dem Stapel zu setzen. Nach dem Abschluß der Funktion freigibt sie automatisch den Speicher. Dies ist für die festen Argumente verwendet.

void __stdcall fnname ( int, int* )
{
    ...
}

int main()
{
    CreateThread ( NULL, 0, fnname, int, int*...... )
}

Hier ist die fnname hat args es direkt in den Stapel schieben.

Ich hatte nie vor, bis heute, diese zu verwenden. Sein, weil in meinem Code Ich verwende Multi-threadding und die Multi-Threading-API ich verwende ist die Fenster ein (_beginthreadex).

Um den Thread zu starten:

_beginthreadex(NULL, 0, ExecuteCommand, currCommand, 0, 0);

Die ExecuteCommand Funktion muss verwenden Sie das __stdcall Schlüsselwort in der Methodensignatur, um beginthreadex es zu nennen:

unsigned int __stdcall Scene::ExecuteCommand(void* command)
{
    return system(static_cast<char*>(command));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top