Quel est le problème avec cet emballage __usercall?

/* * Wrapper from * int func(int a, int b, int c, unsigned int d, signed int e); * to * int __usercall func(int a, int b, int c, unsigned int d, signed int e); */ int func(int a, int b, int c, unsigned int d, signed int e) { __asm { push e push d push c mov ecx, b mov eax, a call __usercall_func // access violation somewhere inside here add esp, 12 } } 

Vous ne pouvez pas effectuer vous-même la ret depuis un bloc asm en ligne, car vous ne savez pas ce que la fonction externe a fait avec le pointeur de stack. Au lieu de cela, vous devez faire en sorte que le code d’assembly conserve la valeur de retour dans une variable locale, que la fonction d’encapsuleur peut renvoyer avec l’instruction C return normale.

Vous devrez probablement également corriger le pointeur de la stack après le retour de __usercall_func , à moins que celui-ci utilise une convention d’appel perverse dans laquelle il extrait ses propres parameters de la stack.