1

GoogleのWebPエンコーダー用のC#ラッパーを作成しようとしています。

呼び出そうとしているメソッドは次のとおりです。

// 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シグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。

私は署名の多くのバリエーションを試しましたが、役に立ちませんでした。

誰かが手がかりを得ましたか?

乾杯、マイク

4

1 に答える 1

2

エラーの原因として最も可能性が高いのは、C ++コードがcdecl呼び出し規約を使用しているのに、pinvokeがstdcall呼び出し規約を使用していることです。次のようにピンボークを変更します。

[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

関数をどのように呼び出しているかがわからず、関数を呼び出すためのプロトコルもわからないため、コードにさらに問題がある可能性があります。関数の呼び出し方法を知るには、関数のシグネチャ以上のものを知る必要があります。ただし、呼び出し規約の問題により、現在のハードルを乗り越えることができると思います。

于 2012-03-13T23:13:47.173 に答える