c # cdecl
et c __ stdcall
raisons de coexistence dans p / invoke
Dans l'interopérabilité p / invoque entre C # et C, il est souvent le cas que les fonctions C # utilisent la convention d'appel CDECL
, tandis que leurs fonctions correspondantes C utilisent la signature __ stdcall
. Cette inadéquation découle de la sélection des congrès d'appels qui a été historiquement continue à ce jour.
__ stdcall
: l'appelant de la fonction Windows nettoie
__ stdcall
hérite de la convention d'appel Pascal 16 bits et est la convention d'appel par défaut pour les fonctions API Windows et com. Il spécifie que la Callee (la fonction appelée) nettoie la pile après l'exécution, ce qui la rend plus compacte dans des environnements liés aux ressources. Cependant, si le nombre de paramètres attendus par l'appelant et la Callee ne correspond pas, cet avantage présente le risque de déséquilibre de pile.
__ Cdecl
: nettoyage de l'appelant de la fonction de paramètre mutable
__ CDECL
est une convention d'appel standard en C pour les fonctions avec un nombre variable de paramètres, tels que printf ()
et scanf ()
. Cette convention met la responsabilité du nettoyage de la pile sur l'appelant, car l'appelant connaît le nombre de paramètres passés. J'ai oublié de spécifier callconvention.cdecl
dans la déclaration [dllimport]
en C # est un piège commun.
__ thiscall
: masquer ce pointeur de la méthode c
__ thisCall
se réfère spécifiquement à C, qui gère le passage caché ce
pointeurs dans la méthode d'instance de la classe. Il est similaire à __ CDECL
, mais le Handler de Marshalling .net P / Invoke ne le prend pas en charge et ne convient donc pas au code C Pinvoke.
Résumer
La coexistence de l'appel cdecl dans
en c # et le __ stdcall
signature en c est le résultat de ces conventions d'appel historiques et de chaque exigence spécifique à la langue. La bonne compréhension de ces conventions, ainsi que le point de saisie
et exact
les propriétés de sont essentielles pour garantir les fonctionnalités p / invoquées correctes et éviter les problèmes potentiels tels que le déséquilibre de pile.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3