Frage

Ich versuche einen C # -Wrapper für zu schreiben Der WebP-Encoder von Google.

Die Methode, die ich aufzurufen versuche, ist:

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

Ausleihen von mc-kays Decoder-Wrapper Ich habe mir Folgendes ausgedacht:

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

Leider erhalte ich bei jedem Versuch, dies auszuführen, die folgende Fehlermeldung:

Ein Aufruf der PInvoke-Funktion 'WebPSharpLib!LibwebpSharp.Nativ.WebPEncoder :: WebPEncodeRGB' hat den Stack aus dem Gleichgewicht gebracht.Dies liegt wahrscheinlich daran, dass die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur übereinstimmt.Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.

Ich habe viele Variationen der Signatur ohne Erfolg ausprobiert.

Hat jemand eine Ahnung?

Jubel, Mike

War es hilfreich?

Lösung

Die wahrscheinlichste Ursache für den Fehler ist, dass der C ++ - Code verwendet cdecl aufrufkonvention, aber Ihr pinvoke verwendet stdcall konvention aufrufen.Ändern Sie den Pinvoke wie folgt:

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

Es gibt keine Notwendigkeit zu spezifizieren CharSet für eine Funktion, die keine Textparameter hat.Ich würde auch verwenden UIntPtr als Rückgabetyp seit size_t ist nicht signiert.

Möglicherweise gibt es weitere Probleme mit Ihrem Code, da wir nicht sehen können, wie Sie die Funktion aufrufen, und wir auch nicht wissen, wie das Protokoll für den Aufruf lautet.Sie müssen mehr als die Funktionssignatur kennen, um zu wissen, wie man eine Funktion aufruft.Ich vermute jedoch, dass das Problem der Aufrufkonvention Sie über Ihre aktuelle Hürde bringen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top