2010-08-24 42 views

Répondre

8

Il s'agissait d'une adaptation à la convention d'appel pascal pour le code 32 bits. Pascal était la convention d'appel pour les systèmes d'exploitation 16 bits comme OS/2 et Windows 3. Pourquoi pascal a été choisi est un peu deviner, même si j'étais un petit chiot à l'époque, mais il est légèrement plus efficace. Ce qui importait quand 640 Ko était tout ce que vous deviez travailler.

La plupart des fonctions Win32 ne sont pas vraies stdcall car elles prescrivent également comment la fonction exportée est décorée avant d'être présentée à l'éditeur de liens. Comme void Mumble (int arg) devient _Mumble @ 4. Le nombre après le @ décrit la taille du cadre d'activation. Mais la plupart des fonctions Win32 sont exportées sans aucune décoration. Probablement pour donner au programmeur une chance de faire fonctionner GetProcAddress(). Je pense que la décoration était destinée à aider l'éditeur de liens à détecter les discordances entre la signature de la fonction API déclarée et la signature réelle. Avoir une discordance dans le nombre d'arguments passés est un kaboom automatique puisque l'appelé déplacera plus ou moins d'arguments de la pile avant d'être passé. Difficile à diagnostiquer aussi. Une faiblesse de stdcall, la convention cdecl n'a pas ce problème.

L'appel interne est un mélange entre stdcall, cdecl et thiscall. Je ne peux pas dire que j'ai déjà détecté un pattern, même si le code Windows à un seul pas n'est pas quelque chose que j'aime.

+2

l'absence de symbole de décoration est que les binaires winapi utilisent des fichiers '.def' pour l'exportation (qui décore la décoration et/ou utilise un ordianl), ce qui rend l'importation via GetProcAddress simple, – Necrolis

+0

Bon point, je pense que tu as raison. –

4

Le code compilé avec stdcall est significativement plus petit que le code compilé avec cdecl (l'alternative). Au moment où la décision a été prise, le plus petit code était le code plus rapide.

+0

En fait, je préférais la réponse de Hans Passant à la mienne, mais peu importe. –

+0

Parce que vous êtes un Microsoftee (depuis longtemps), j'ai choisi votre réponse. – Benjamin

+0

Avez-vous des preuves pour cette réclamation? Intuitivement je pense qu'il devrait être un lavage entre stdcall et cdecl et googling ne vient pas avec des comparaisons de taille entre les deux conventions d'appel. –