Por que as chamadas Cdecl são muitas vezes incompatíveis na Convenção P / Convocatória “padrão”?
Eu estou trabalhando em uma base de código bastante grande em que a funcionalidade de C ++ é P / Invocada de c #.
Existem muitas chamadas na nossa base de código, como ...
C ++:
extern "C" int __stdcall InvokedFunction(int);
Com um correspondente C #:
[DllImport("CPlusPlus.dll", ExactSpelling = true, SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
private static extern int InvokedFunction(IntPtr intArg);
Eu vasculhei a rede (na medida em que sou capaz) pelo raciocínio a respeito de porque essa aparente incompatibilidade existe. Por exemplo, por que há um Cdecl dentro do C # e __stdcall dentro do C ++? Aparentemente, isso resulta na pilha sendo limpa duas vezes, mas, em ambos os casos, as variáveis são colocadas na pilha na mesma ordem reversa, de modo que eu não vejo nenhum erro, embora a possibilidade de que as informações de retorno sejam apagadas no caso de tentando um rastreamento durante a depuração?
Do MSDN:http://msdn.microsoft.com/pt-br/library/2x8kf7zx%28v=vs.100%29.aspx
// explicit DLLImport needed here to use P/Invoke marshalling
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl, CharSet = CharSet::Ansi)]
// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);
Mais uma vez, há tantoextern "C"
no código C ++ eCallingConvention.Cdecl
no c #. Por que não é isso?CallingConvention.Stdcall
? Ou, além disso, por que há__stdcall
no C ++?
Desde já, obrigado!