Domanda

Sto cercando di scrivere un wrapper c # per Google Webp Encoder .

Il metodo sto cercando di chiamare è:

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

prendere in prestito da DECODER MC-KAYWrapper Ho trovato il seguente:

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

Sfortunatamente ogni volta che provo a eseguire questo ottengo il seguente errore:

.

Una chiamata a Pinvoke Function 'Webpsharplib! libwebpsharp.native.webpencoder :: Webpancodergb' ha sbilanciato lo stack.Questo è probabile perché la firma del Pinvoke gestita non corrisponde alla firma del bersaglio non gestito.Verificare che la Convenzione e i parametri chiamanti della firma Pinvoke corrispondano alla firma non gestita da destinazione.

Ho provato molte varianti sulla firma senza alcun risultato.

Qualcuno ha un indizio?

Cheers, Mike

È stato utile?

Soluzione

Molto probabilmente la causa dell'errore è che il codice C ++ utilizza la convenzione di chiamata cdecl, ma il Pinvoke utilizza la convenzione di chiamata stdcall.Cambia il Pinvoke come segue:

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

Non è necessario specificare CharSet per una funzione che non ha parametri di testo.Utilizzerò anche UIntPtr come tipo di ritorno poiché size_t non è firmato.

Ci possono essere più problemi con il tuo codice perché non possiamo vedere come stai chiamando la funzione e non sappiamo anche cosa è il protocollo per chiamarlo.Devi sapere più della firma della funzione per sapere come chiamare una funzione.Tuttavia, sospetto che il problema della convenzione chiamante ti porterà oltre il tuo attuale ostacolo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top