このWebP C ++関数の正しいC#ピンボーク署名
質問
im GoogleのWebPエンコーダ。
電話しようとしているメソッドImは次のとおりです。
// 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);
.
MC-Kayのデコーダラッパー私は次のものを思い付いた:
[DllImport("libwebp", CharSet = CharSet.Auto)]
public static extern IntPtr WebPEncodeRGB(IntPtr data, int width, int height, int stride, float quality, ref IntPtr output);
.
残念ながら私が実行しようとするたびに次のエラーが発生します:
Pinvoke関数 'webpsharplib!libwebpsharp.native.webpencoder :: webpencodergb'がスタックをアンバランスにしています。これは、管理されていないPinvokeシグネチャが管理されていないターゲット署名と一致しないためです。PinVokeシグネチャの呼び出し規則とパラメータがターゲット対象外の署名と一致することを確認してください。
私は署名の多くのバリエーションをavailにしなかった。
誰かが手がかりを持っていますか?
歓声、 マイク
解決
最も誤りの原因は、C ++コードがcdecl
呼び出し規則を使用するが、Pinvokeはstdcall
呼び出し規約を使用することです。Pinvokeを次のように変更します。
[DllImport("libwebp", CallingConvention=CallingConvention.Cdecl)]
public static extern UIntPtr WebPEncodeRGB(IntPtr data, int width, int height,
int stride, float quality, ref IntPtr output);
.
テキストパラメータがない関数のCharSet
を指定する必要はありません。UIntPtr
は符号なしであるため、リターンタイプとしてsize_t
を使用します。
あなたのコードにもっと問題があるかもしれませんが、私たちはあなたが関数を呼び出している方法がわかりませんので、それを呼び出すためのプロトコルが何であるかもわかりません。関数の呼び出し方法を知るために関数署名以上のものを知る必要があります。しかし、私は呼びかけ規約の問題があなたの現在のハードルを過ぎると思われると思います。
所属していません StackOverflow