Question

J'essaie d'écrire un wrapper C# pour L'encodeur WebP de Google.

La méthode que j'essaie d'appeler est la suivante :

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

Emprunter à wrapper du décodeur de mc-kay J'ai trouvé ce qui suit :

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

Malheureusement, chaque fois que j'essaye de l'exécuter, j'obtiens l'erreur suivante :

Un appel à la fonction PInvoke 'WebPSharpLib!LibwebpSharp.Native.WebPEncoder::WebPEncodeRGB' a déséquilibré la pile.Cela est probablement dû au fait que la signature PInvoke gérée ne correspond pas à la signature cible non gérée.Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature cible non gérée.

J'ai essayé de nombreuses variantes de la signature en vain.

Quelqu'un a une idée ?

Bravo, Mike

Était-ce utile?

La solution

La cause la plus probable de l'erreur est que le code C++ utilise cdecl convention d'appel mais votre pinvoke utilise stdcall convention d'appel.Modifiez le pinvoke comme suit :

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

Il n'est pas nécessaire de préciser CharSet pour une fonction qui n'a pas de paramètres de texte.J'utiliserais aussi UIntPtr comme type de retour depuis size_t n'est pas signé.

Il peut y avoir plus de problèmes avec votre code car nous ne pouvons pas voir comment vous appelez la fonction et nous ne savons pas non plus quel est le protocole pour l'appeler.Vous devez en savoir plus que la signature de la fonction pour savoir comment appeler une fonction.Cependant, je soupçonne que le problème de la convention d'appel vous permettra de surmonter votre obstacle actuel.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top