A assinatura C# PInvoke correta para esta função WebP C++
Pergunta
Estou tentando escrever um wrapper C# para Codificador WebP do Google.
O método que estou tentando chamar é:
// Returns the size of the compressed data (pointed to by *output), or 0 if
// an error occurred. The compressed data must be released by the caller
// using the call 'free(*output)'.
WEBP_EXTERN(size_t) WebPEncodeRGB(const uint8_t* rgb,
int width, int height, int stride,
float quality_factor, uint8_t** output);
Emprestando de Invólucro do decodificador de Mc-Kay Eu descobri o seguinte:
[DllImport("libwebp", CharSet = CharSet.Auto)]
public static extern IntPtr WebPEncodeRGB(IntPtr data, int width, int height, int stride, float quality, ref IntPtr output);
Infelizmente sempre que tento executar isso recebo o seguinte erro:
Uma chamada para a função PInvoke 'WebPSharpLib!LibwebpSharp.Native.WebPEncoder::WebPEncodeRGB' desequilibrou a pilha.Provavelmente, isso ocorre porque a assinatura PInvoke gerenciada não corresponde à assinatura de destino não gerenciada.Verifique se a convenção de chamada e os parâmetros da assinatura PInvoke correspondem à assinatura não gerenciada de destino.
Eu tentei muitas variações na assinatura sem sucesso.
Alguém tem alguma ideia?
Obrigada Microfone
Solução
A causa mais provável do erro é que o código C++ usa cdecl
convenção de chamada, mas seu pinvoke usa stdcall
convenção de chamada.Altere o pinvoke da seguinte maneira:
[DllImport("libwebp", CallingConvention=CallingConvention.Cdecl)]
public static extern UIntPtr WebPEncodeRGB(IntPtr data, int width, int height,
int stride, float quality, ref IntPtr output);
Não há necessidade de especificar CharSet
para uma função que não possui parâmetros de texto.eu também usaria UIntPtr
como o tipo de retorno desde size_t
não está assinado.
Pode haver mais problemas com o seu código porque não conseguimos ver como você está chamando a função e também não sabemos qual é o protocolo para chamá-la.Você precisa saber mais do que a assinatura da função para saber como chamar uma função.No entanto, suspeito que o problema da convenção de chamadas o ajudará a superar o obstáculo atual.