2009-08-24 23 views
0

マネージコードでshort型の配列へのポインタを含む構造体を表現する方法に問題があります。構造体は次のようになります「shortValues」のタイプの配列へのポインターをマーシャリングする(マネージC# - >アンマネージC++)

typedef struct 
{ 
    short size; 
    unsigned short** shortValues; 
} UnmanagedStruct; 

メモリは、アンマネージコードの内部に割り当てられている - したがって、そのフィールドは、単に短い値の配列へのポインタであってもそのように、間接の追加のレベルが加え割り当てられたメモリは呼び出し元(マネージコード)にも見えます。 'size'フィールドは、配列内の要素の数を表します。これをマネージコードでどのように表現すればよいですか?

IntPtrに渡すと思っていましたが、管理されていない呼び出しが戻ったときに値にアクセスする方法を理解できませんでした。

答えて

0

安全でないコードは大丈夫ですか?

public unsafe struct UnmanagedStruct 
{ 
    public short size; 
    public ushort** shortValues; 
} 

[DllImport("example.dll")] 
public static extern void GetUnmanagedStruct(out UnmanagedStruct s); 

あなたがushortの配列へのポインタがある場合:

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     for (ushort* p = s.shortValues[i]; p != null; p++) 
     { 
      ushort x = *p; 
      Console.WriteLine(x); 
     } 
    } 
} 
+0

このコードは、私にとってはまさに正しいものです。ありがとうdtb!私はあなたの注意を払っている間に、別の質問をすることができますか?私は別のスレッドでそれを投稿しました: http://stackoverflow.com/questions/1323797/marshaling-pointer-to-an-array-of-strings – Dilip

+0

ご意見:あなたの質問に答えを投稿するよりもあなたの質問を更新してください新しい内容の質問。また、答えがあなたの問題を解決するなら、それを受け入れることを忘れないでください! :) – dtb

+0

@dtb:私はここで盲目でなければならないが、私はどのように答えを "受け入れる"のですか? – Dilip

0

申し訳ありませんが、みんな:あなたはushort Sのヌルで終了する配列の配列を持っている場合は

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     ushort x = (*s.shortValues)[i]; 
     Console.WriteLine(x); 
    } 
} 

を。問題文が間違っています。次のようになります。

符号なしshort ** shortValues;

は、ショートに対するポインタの配列へのポインタです。したがって、各要素は、私がこれをやって考えることができる唯一の方法である短い*

そのものです:

パブリッククラスUnmanagedStruct { 公共int型のサイズ。 public IntPtr shortValues;アンマネージコードからの呼び出しが戻ると }

のIntPtr [] listOfShorts =新規のIntPtr [サイズ]。 Marshal.Copy(shortValues、listOfShorts、0、size);

listOfShortsの各IntPtrはshort []を指すようになりました。しかし今、問題は私が個々の配列のサイズを知ることができないということです。つまり、配列を抽出できないということです。

どこかの重要な情報が欠落している必要があります。

関連する問題