2009-05-06 10 views
2

私はint*をC#プログラムに返すC++ DLLを持っています。問題は、C#のint*が割り当て後にnullのままであることです。C#でIntPtrをint *に変換しますか?

C++の結果をIntPtrに割り当てると、null以外の正しい値が得られます。ただし、これをint*に変換しようとすると、nullとなります。

私が試してみた:

IntPtr intp = cppFunction();   // Non-null. 

int* pi = (int *) intp;     // Results in null. 

int* pi = (int *) intp.ToPointer(); // Results in null. 


void* vp = intp.ToPointer(); 

int* pi = (int *) vp;     // Results in null, but vp is non-null. 

にはどうすればnull以外int*を得ることができますか?

ありがとうございます!あなたの問題を解決する必要があり

void cppFunction(ref int* ptr) { 
    ptr = somevalue; 
} 

: アラン

+0

私は "cppFunction()" とはmsvcrt.dllから標準のmalloc()関数を使用しました。それは私のために大丈夫だった、私は読んだ/割り当てられたメモリの場所を書き込むことができます。 intp(IntPtr intp =(IntPtr)1000;)に乱数を割り当てたときに、逆参照するときにのみNullPointerExceptionが発生しました。それでも、ポインタの値は決してヌルではありませんでした... あなたは私に間違った結果をもたらす小さくて完全なプログラムを与えることができますか? – Hali

+0

必要なメモリを割り当ててIntPtrを渡すことができるように、C++をリファクタリングするオプションがありますか?そのようにする方がいいでしょう - あるいは、C#でメモリを割り当てるコールバックをフックしてください。http://stackoverflow.com/questions/9378626/how-can-i-return-a-stringbuilder-or-other-string- buffer-from-a-pinvoke-native-ca – dice

答えて

4

あなたcppFunction宣言のようなものでなければなりません。

また、これが役に立つかもしれません: http://www.pcreview.co.uk/forums/thread-2902012.php

+0

Jamesに感謝します。私はこのようなあなたのメソッドを試しました: [DllImport( "EntryPoint = @"?getLineContentsAsArg @@ YAXAAPAH @ Z ")] パブリックセーフな静的なextern void getLineContentsAsArg(ref int * lca); DLLEXPORT空隙getLineContentsAsArg(INT *&LCA) {\t LCA = calculateLineContents()。 } ポインタ値がDLLに割り当てられますが、C#に戻ったときにNULLになります。 あなたの例を見て、最後のものだけがC#のポインタ変数に割り当てようとします。これを試すたびに、割り当ての結果はnullになります。 私が間違っていることが見えますか? ありがとう! – user20493

+0

私は刈り取りを終えるともっと見る必要がありますが、最近私が解決したのは、C#でバッファを割り当て、IntPtrと共にポインターを送り、長さを取得しました。あなたが遭遇している問題はおそらく、C++関数がmallocを実行して文字列を返すことを期待しているからです。その場合、ポインタへのポインタを渡す必要があるかもしれませんが、C#でどのように解放するのかはわかりません。 –

関連する問題