Pregunta

Estoy intentando escribir un contenedor de C# para Codificador WebP de Google.

El método que intento llamar es:

// 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);

Préstamo de Envoltorio del decodificador de mc-kay. Se me ocurrió lo siguiente:

[DllImport("libwebp", CharSet = CharSet.Auto)]
public static extern IntPtr WebPEncodeRGB(IntPtr data, int width, int height, int stride, float quality, ref IntPtr output);

Desafortunadamente, cada vez que intento ejecutar esto aparece el siguiente error:

Una llamada a la función PInvoke 'WebPSharpLib!LibwebpSharp.Native.WebPEncoder::WebPEncodeRGB' ha desequilibrado la pila.Es probable que esto se deba a que la firma PInvoke administrada no coincide con la firma de destino no administrada.Compruebe que la convención de llamada y los parámetros de la firma PInvoke coincidan con la firma no administrada de destino.

Probé muchas variaciones de la firma sin éxito.

¿Alguien tiene una pista?

Saludos, Mike

¿Fue útil?

Solución

La causa más probable del error es que el código C++ utiliza cdecl convención de llamadas pero tu pinvoke usa stdcall convención de llamadas.Cambie el pinvoke de la siguiente manera:

[DllImport("libwebp", CallingConvention=CallingConvention.Cdecl)]
public static extern UIntPtr WebPEncodeRGB(IntPtr data, int width, int height, 
    int stride, float quality, ref IntPtr output);

No es necesario especificar CharSet para una función que no tiene parámetros de texto.Yo también usaría UIntPtr como tipo de devolución desde size_t no está firmado.

Puede haber más problemas con su código porque no podemos ver cómo llama a la función y tampoco sabemos cuál es el protocolo para llamarla.Necesita saber más que la firma de la función para saber cómo llamar a una función.Sin embargo, sospecho que el problema de la convención de llamadas le ayudará a superar su obstáculo actual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top