Qu'est-ce que __stdcall?
Je suis en train d'apprendre à propos de la programmation Win32, et la WinMain
prototype ressemble:
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
J'étais confus quant à ce que cela WINAPI
identificateur a été détecté:
#define WINAPI __stdcall
À quoi ça sert? Je suis confus par cette manière de faire quelque chose à tous, après un type de retour. Qu'est-ce que __stdcall
pour? Qu'est-ce qu'il y a quelque chose entre le type de retour et le nom de la fonction?
- Le "dummy" le changement a été d'accord dans ce cas, mais en général, vous pouvez utiliser
s à obtenir autour de la bête (et contre-productifs-cas au point) au minimum 6 caractères.
Vous devez vous connecter pour publier un commentaire.
__stdcall
est la convention d'appel utilisée pour la fonction. Elle indique au compilateur de règles qui s'appliquent pour la mise en place de la pile, en poussant des arguments et d'obtenir une valeur de retour.Il y a un certain nombre d'autres conventions d'appel,
__cdecl
,__thiscall
,__fastcall
et merveilleusement nommé__naked
.__stdcall
est la convention d'appel standard pour Win32, les appels système.Wikipedia couvre la détails.
Principalement à des questions lorsque vous appelez une fonction à l'extérieur de votre code (par exemple, un OS API) ou de l'OS vous appelle (comme c'est le cas ici avec WinMain). Si le compilateur ne sait pas la bonne convention d'appel, alors vous obtiendrez probablement très étrange se bloque, comme la pile ne sera pas gérée correctement.
C ou C++ lui-même ne définit pas ces identifiants. Ils sont compilateur extensions et stand pour certaines conventions d'appel. Qui détermine où mettre les arguments, dans quel ordre, où la fonction appelée trouverez l'adresse de retour, et ainsi de suite. Par exemple, __fastcall signifie que les arguments des fonctions sont transmis à travers les registres.
La Article De Wikipedia donne un aperçu des différentes conventions d'appel trouvé là-bas.
Les réponses jusqu'à présent, ont couvert les détails, mais si vous n'avez pas l'intention de descendre à l'assemblée, alors tout ce que vous devez savoir est que l'appelant et l'appelé doit utiliser la même convention d'appel, autrement vous aurez des bugs qui sont difficiles à trouver.
Je suis d'accord que toutes les réponses sont correctes, mais voici la raison. Microsoft compilateurs C et C++ de fournir des diverses conventions d'appel pour (prévu) de la vitesse d'appels de fonction au sein d'une application en C et C++ fonctions. Dans chaque cas, l'appelant et l'appelé doit nous mettre d'accord sur convention d'appel à utiliser. Maintenant, Windows lui-même fournit des fonctions (Api), et celles qui ont déjà été compilé, donc quand vous les appelez, vous devez vous conformer à eux. Tous les appels à l'Api Windows, et des rappels à partir de Windows Api, doit utiliser le __stdcall convention.
Jeter un oeil à:
http://www.codeproject.com/KB/cpp/calling_conventions_demystified.aspx
Il a à faire avec la façon dont la fonction est appelée - fondamentalement, l'ordre dans lequel les choses sont mises sur la pile, et qui est responsable pour le nettoyage.
Voici la documentation, mais il ne signifie pas grand chose, sauf si vous comprenez la première partie:
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx
__stdcall est utilisé pour mettre les arguments de la fonction dans la pile.
Après l'achèvement de la fonction qu'il libère automatiquement la mémoire.
Il est utilisé pour les arguments fixes.
Ici la fnname a args directement push dans la pile.
Je n'ai jamais eu à utiliser cette avant jusqu'à aujourd'hui. Son parce que dans mon code je suis en utilisant le multi-threadding et le multi-threading API que j'utilise est celui de windows (_beginthreadex).
Pour démarrer le thread:
La ExecuteCommand fonction DOIT utiliser l' __stdcall mot-clé dans la signature de la méthode pour beginthreadex l'appeler: