2016-06-30 5 views
0

I以下のC++の関数があります:コード(もちろん、常にC#で、このようなPInvoking機能

[DllImport("pHash.dll", CallingConvention = CallingConvention.Cdecl)] 
private static extern int my_func(
    [MarshalAs(UnmanagedType.LPStr)] 
    StringBuilder error); 

と使用:私はC#でこのようにそれをPInvokingい

int my_func(char* error) { 
    // Have access here to an Exception object called `ex` 
    strcpy(error, ex.what()); 
    return 0; 
} 

を):私はこれを実行すると、プログラムは例外なくクラッシュをある(意味がひどくクラッシュ

StringBuilder error = new StringBuilder(); 
int returnValue = my_func(error); 

だけが閉じ、それは私ですt)。私は間違って何をしていますか?

+1

[マシュー](http://stackoverflow.com/a/38117156/5528593)の回答は正しいようです。しかし、あなたの次の質問については、少なくともエラーメッセージを教えてください。 "ひどくクラッシュする"というのは、例外メッセージと同じくらい良いヒントです。 –

+0

例外はありません、それは問題です。プログラムは終了し、それはそれです... – Andry

+0

この関数のインターフェイスは不可避的に壊れています。バッファオーバーランから保護することはできません。呼び出し元にバッファの長さを渡させ、バッファの最後を超えてコピーしないようにする必要があります。 –

答えて

2

ここでの質問は:あなたのコードは文字列バッファーの大きさをどのように知っていますか?

通常、あなたは見つけ出す方法があります。この情報がない場合、関数を呼び出す前に、StringBuilderを期待した最大の文字列に初期化することだけができます。例えば

 StringBuilder error = new StringBuilder(1024); // Assumes 1024 chars max. 

あなたのコードは(と思う)16デフォルトの容量、とStringBuilderを渡しているので、それよりも大きな任意の文字列は、クラッシュの原因となります。

関連する問題