Was ist __stdcall?

Lesezeit: 3 Minuten

Benutzeravatar von Tristan Havelick
Tristan Havelick

Ich lerne etwas über die Win32-Programmierung und die WinMain Prototyp sieht so aus:

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

Ich war verwirrt, was das ist WINAPI Kennung war für und gefunden:

#define WINAPI      __stdcall

Was bewirkt das? Ich bin verwirrt darüber, dass nach einem Rückgabetyp überhaupt etwas vorhanden ist. Was ist __stdcall zum? Was bedeutet es, wenn zwischen Rückgabetyp und Funktionsname etwas steht?

  • @AndrewProck Die “Dummy” -Änderung war in diesem Fall in Ordnung, aber im Allgemeinen können Sie sie verwenden  s um das dumme (und kontraproduktive – Fallbeispiel) 6-Zeichen-Minimum zu umgehen.

    – Adi Inbar

    10. Januar 2014 um 0:01 Uhr

Benutzeravatar von Rob Walker
Rob Walker

__stdcall ist die für die Funktion verwendete Aufrufkonvention. Dies teilt dem Compiler die Regeln mit, die für das Einrichten des Stapels, das Übertragen von Argumenten und das Erhalten eines Rückgabewerts gelten.

Es gibt eine Reihe anderer Aufrufkonventionen, __cdecl, __thiscall, __fastcall und die wunderbar benannt __declspec(naked). __stdcall ist die Standard-Aufrufkonvention für Win32-Systemaufrufe.

Wikipedia deckt die ab Einzelheiten.

Es spielt vor allem eine Rolle, wenn Sie eine Funktion außerhalb Ihres Codes aufrufen (z. B. eine Betriebssystem-API) oder das Betriebssystem Sie aufruft (wie hier bei WinMain). Wenn der Compiler die korrekte Aufrufkonvention nicht kennt, werden Sie wahrscheinlich sehr seltsame Abstürze bekommen, da der Stack nicht korrekt verwaltet wird.

  • Siehe diese Frage für ein Beispiel für sehr starke Abstürze stackoverflow.com/questions/696306/…

    – scharfer Zahn

    17. April 2009 um 4:08 Uhr

  • Wenn ich mich nicht irre, steuern diese Aufrufkonventionen, wie der Compiler den Assemblercode erzeugt. Bei der Verbindung mit dem Assemblercode ist es dann wichtig, dass die Aufrufkonvention beachtet wird, um Stapelprobleme zu vermeiden. Es gibt hier eine schöne Tabelle, die einige Konventionen dokumentiert: msdn.microsoft.com/en-us/library/984x0h58.aspx

    – Nikolaus Müller

    24. Juli 2015 um 17:03 Uhr

  • Können wir sagen, dass dies bestimmte illegale Optimierungen deaktivieren würde?

    – Kesari

    5. Juni 2017 um 14:52 Uhr

C oder C++ selbst definieren diese Bezeichner nicht. Sie sind Compiler-Erweiterungen und stehen für bestimmte Aufrufkonventionen. Dadurch wird bestimmt, wo Argumente in welcher Reihenfolge abgelegt werden, wo die aufgerufene Funktion die Rücksprungadresse findet und so weiter. Beispielsweise bedeutet __fastcall, dass Argumente von Funktionen über Register übergeben werden.

Das Wikipedia-Artikel gibt einen Überblick über die dort gefundenen unterschiedlichen Aufrufkonventionen.

Die bisherigen Antworten haben die Details abgedeckt, aber wenn Sie nicht beabsichtigen, zur Assemblierung zurückzukehren, müssen Sie nur wissen, dass sowohl der Aufrufer als auch der Aufgerufene dieselbe Aufrufkonvention verwenden müssen, da Sie sonst Fehler bekommen sind schwer zu finden.

Ich stimme zu, dass alle bisherigen Antworten richtig sind, aber hier ist der Grund. Die C- und C++-Compiler von Microsoft bieten verschiedene Aufrufkonventionen für die (beabsichtigte) Geschwindigkeit von Funktionsaufrufen innerhalb der C- und C++-Funktionen einer Anwendung. In jedem Fall müssen sich der Aufrufer und der Angerufene darauf einigen, welche Aufrufkonvention verwendet werden soll. Jetzt stellt Windows selbst Funktionen (APIs) bereit, und diese wurden bereits kompiliert, sodass Sie sich an sie halten müssen, wenn Sie sie aufrufen. Alle Aufrufe an Windows-APIs und Rückrufe von Windows-APIs müssen die __stdcall-Konvention verwenden.

Schauen Sie sich an:

http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx

Benutzeravatar von Joel Coehoorn
Joel Coehoorn

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

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

Benutzeravatar von Philippe Lhardy
Philipp Lhardy

__stdcall wird verwendet, um die Funktionsargumente in den Stack zu legen. Nach Beendigung der Funktion wird der Speicher automatisch freigegeben. Dies wird für feste Argumente verwendet.

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

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

Hier die fnname hat args es direkt in den Stack zu schieben.

1425060cookie-checkWas ist __stdcall?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy