J'apprends la programmation Win32 et le WinMain
prototype ressemble à ceci:
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
Je ne savais pas à quoi WINAPI
servait cet identifiant et j'ai trouvé:
#define WINAPI __stdcall
Qu'est-ce que cela fait? Je suis confus par le fait que cela ait quelque chose après un type de retour. A quoi ça sert __stdcall
? Qu'est-ce que cela signifie quand il y a quelque chose entre le type de retour et le nom de la fonction?
c
winapi
calling-convention
stdcall
Tristan Havelick
la source
la source
s pour contourner le minimum de 6 caractères stupides (et contre-productifs - cas d'espèce).Réponses:
__stdcall
est la convention d'appel utilisée pour la fonction. Cela indique au compilateur les règles qui s'appliquent pour configurer la pile, pousser des arguments et obtenir une valeur de retour.Il y a un certain nombre d'autres conventions d'appel,
__cdecl
,__thiscall
,__fastcall
et merveilleusement nommé__declspec(naked)
.__stdcall
est la convention d'appel standard pour les appels système Win32.Wikipedia couvre les détails .
Cela compte principalement lorsque vous appelez une fonction en dehors de votre code (par exemple une API OS) ou que l'OS vous appelle (comme c'est le cas ici avec WinMain). Si le compilateur ne connaît pas la convention d'appel correcte, vous aurez probablement des plantages très étranges car la pile ne sera pas gérée correctement.
la source
C ou C ++ lui-même ne définissent pas ces identificateurs. Ce sont des extensions de compilateur et représentent certaines conventions d'appel. Cela détermine où placer les arguments, dans quel ordre, où la fonction appelée trouvera l'adresse de retour, et ainsi de suite. Par exemple, __fastcall signifie que les arguments des fonctions sont passés sur les registres.
L' article de Wikipédia donne un aperçu des différentes conventions d'appel qui s'y trouvent.
la source
Les réponses jusqu'à présent ont couvert les détails, mais si vous n'avez pas l'intention de passer à l'assemblage, tout ce que vous devez savoir est que l'appelant et l'appelé doivent utiliser la même convention d'appel, sinon vous obtiendrez des bogues qui sont difficiles à trouver.
la source
Je conviens que toutes les réponses à ce jour sont correctes, mais voici la raison. Les compilateurs C et C ++ de Microsoft fournissent diverses conventions d'appel pour la vitesse (prévue) des appels de fonction dans les fonctions C et C ++ d'une application. Dans chaque cas, l'appelant et l'appelé doivent s'entendre sur la convention d'appel à utiliser. Maintenant, Windows lui-même fournit des fonctions (API), et celles-ci ont déjà été compilées, donc lorsque vous les appelez, vous devez vous y conformer. Tous les appels aux API Windows et les rappels des API Windows doivent utiliser la convention __stdcall.
la source
Jettes un coup d'oeil à:
http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx
la source
Cela a à voir avec la façon dont la fonction est appelée - essentiellement l'ordre dans lequel les choses sont placées sur la pile et qui est responsable du nettoyage.
Voici la documentation, mais cela ne veut pas dire grand chose à moins que vous ne compreniez la première partie:
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx
la source
__stdcall est utilisé pour mettre les arguments de la fonction dans la pile. Une fois la fonction terminée, il désalloue automatiquement la mémoire. Ceci est utilisé pour les arguments fixes.
Ici, le fnname a des arguments qu'il pousse directement dans la pile.
la source
Je n'ai jamais eu à l'utiliser avant jusqu'à aujourd'hui. C'est parce que dans mon code, j'utilise le multi-threading et que l'API multi-threading que j'utilise est celle de Windows (_beginthreadex).
Pour démarrer le fil:
La fonction ExecuteCommand DOIT utiliser le mot clé __stdcall dans la signature de méthode pour que beginthreadex l'appelle:
la source