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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top