2012-03-13 8 views
1

Google's WebP encoderのC#ラッパーを記述しようとしています。呼び出そうとこのWebP C++関数の正しいC#PInvoke署名

方法イムはされています。私はこれを実行しようとする時はいつでも残念ながら、私は次のエラーを取得する

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

:私は次のように出ているmc-kay's decoder wrapperから

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

借入:

A call to PInvoke function 'WebPSharpLib!LibwebpSharp.Native.WebPEncoder::WebPEncodeRGB' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

私は署名に多くの変形を試みましたl。

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

乾杯、 マイク・エラーのため

+0

最後の 'IntPtr'パラメータで' ref'を削除します。 – JaredPar

+1

@ JaredPar:いいえ、しないでください。それは二重ポインタです。 – SLaks

+0

C++の 'int'sのサイズはどれくらいですか? – SLaks

答えて

2

最も可能性の高い原因は、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を指定する必要はありません。 size_tが署名されていないので、戻り値の型としてUIntPtrも使用します。

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

+0

それを得ました! mc-kayが彼のDllImportsにCdeclを持っていなかったので私を捨てた – mikeysee

関連する問題