2012-04-05 17 views
0

.net用にfreetype2を設定しようとしていますが、まだまだ幸運ではありません。だから私はthis questionから答えを使用しています。現時点では、Init_FreeType関数を使用しようとすると、保護されたメモリに書き込もうとする例外が発生します。Freetype .netラッパーの問題(保護されたメモリ例外を書き込もうとしました)

Intptr library = new Intptr(); 
FreeType.FT.Init_FreeType(library); 

とラッパーでInit_FreeType関数の宣言は以下の通りである:私が使用するコードは次のようである

[DllImport(FT_DLL, EntryPoint = "FT_Init_FreeType"), SuppressUnmanagedCodeSecurity] 
public static extern int Init_FreeType(IntPtr /*IntPtr LibraryRec_*/ alibrary); 

任意のアイデア?

答えて

1

Init_FreeTypeの宣言が間違っています。おそらく:

public static extern int Init_FreeType(ref IntPtr alibrary); 

(パラメータはref)である必要があります。そして、それを呼び出すために:

IntPtr library = IntPtr.Zero; 
FreeType.FT.Init_FreeType(ref library); 

私は何が起こっている疑いがあることInit_FreeTypeを基準として渡された値を処理し、そのメモリ位置にライブラリハンドルを保存しようとしていることです。しかし、の値(ポインタの位置ではなく)のポインタを渡しているので、それは雑草に行き渡ります。 FT_Init_FreeTypeため

ドキュメントとしてそれを定義しています:コメントに応答して

さらに詳細

FT_EXPORT(FT_Error) FT_Init_FreeType(FT_Library *alibrary); 

FT_Errorintで、FT_Library

typedef struct FT_LibraryRec_ *FT_Library; 

あるので、あなたは間違いなく必要がありますかrefを呼び出してください。管理されたプロトタイプは上に示した通りでなければなりません。

スタックの不均衡は、誤った呼び出し規約によってほぼ確実に引き起こされます。 .NETでは、デフォルトの呼び出し規約はstdcallです。私は、FreeTypeがcdecl呼び出し規約を使用しているように見えます。あなたのDllImportは次のようになります:

[DllImport(FT_DLL, EntryPoint="FT_Init_FreeType", 
    CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] 
+0

私はちょうどそれを試みましたが、これは問題ではないと思います。 "PInvokeStackImbalanceが検出されました。管理されたPInvoke署名が管理されていないターゲット署名と一致しないためです。" – muku

+0

@muku:更新されたレスポンスを参照してください。 –

+0

確かに私はあなたの更新された答えのように私のコードを変更し、今すぐ動作します。今私はあなたの提案によると、他の関数も同様の例外をスローするため、ラッパーのほとんどすべての関数を変更する必要があります..ありがとう:) – muku

関連する問題