Udostępnij za pośrednictwem


__stdcall

Konwencja __stdcall wywoływania służy do wywoływania funkcji interfejsu API Win32. Obiekt wywoływany czyści stos, więc kompilator tworzy vararg funkcje __cdecl. Funkcje korzystające z tej konwencji wywoływania wymagają prototypu funkcji. Modyfikator __stdcall jest specyficzny dla firmy Microsoft.

Składnia

return-type __stdcall function-name[( argument-list )]

Uwagi

Na poniższej liście przedstawiono implementację niniejszej konwencji wywoływania.

Element Implementacja
Kolejność przekazywania argumentów Od prawej do lewej.
Konwencja przekazywania argumentów Według wartości, chyba że zostanie przekazany wskaźnik lub typ odwołania.
Odpowiedzialność za utrzymanie stosu Wywołana funkcja wyskakuje własne argumenty ze stosu.
Konwencja dekorowania nazw Podkreślenie (_) jest poprzedzone nazwą. Po nazwie następuje znak at (@), po którym następuje liczba bajtów (w przecinku) na liście argumentów. W związku z tym funkcja zadeklarowana jako int func( int a, double b ) jest ozdobiona w następujący sposób: _func@12
Konwencja translacji wielkości liter Brak

/ Gz opcji kompilatora określa __stdcall dla wszystkich funkcji, które nie zostały jawnie zadeklarowane z inną konwencją wywoływania.

Aby uzyskać zgodność z poprzednimi wersjami, jest synonimem, _stdcall __stdcall chyba że określono opcję /Za kompilatora (Wyłącz rozszerzenia języka).

Funkcje zadeklarowane przy użyciu __stdcall modyfikatora zwracają wartości tak samo jak funkcje zadeklarowane przy użyciu metody __cdecl.

W procesorach __stdcall ARM i x64 są akceptowane i ignorowane przez kompilator; w architekturach ARM i x64 zgodnie z konwencją argumenty są przekazywane w rejestrach, gdy to możliwe, a kolejne argumenty są przekazywane na stos.

W przypadku funkcji niestatycznych klas, jeśli funkcja jest zdefiniowana poza wierszem, modyfikator konwencji wywoływania nie musi być określony w definicji poza wierszem. Oznacza to, że dla metod niestatycznej składowej klasy przyjmowana jest konwencja wywoływania określona podczas deklaracji w punkcie definicji. Biorąc pod uwagę tę definicję klasy,

struct CMyClass {
   void __stdcall mymethod();
};

this

void CMyClass::mymethod() { return; }

jest odpowiednikiem tego

void __stdcall CMyClass::mymethod() { return; }

Przykład

W poniższym przykładzie użycie __stdcall wyników we wszystkich WINAPI typach funkcji obsługiwanych jako wywołanie standardowe:

// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

Zobacz też

Przekazywanie argumentów i konwencje nazewnictwa
Słowa kluczowe