2011-10-20 9 views
3

私は以下のC#コードに 'アンマネージc'コードをマーシャリングしています。C#で構造化データへのマーシャルされたポインタにアクセスする方法は?

[DllImport("ContainerDll.dll", CallingConvention = CallingConvention.Cdecl)] 
    public static extern IntPtr NodeSearch(IntPtr firstNode, string key); 

    IntPtr firstNode = IntPtr.Zero; 

    private void button4_Click(object sender, EventArgs e) 
    { 
     IntPtr ret = NodeSearch(firstNode, "key_string"); 
    } 

    //NodeSearch method will be called which is present in 'ContainerDll.dll' 
    //pointer to structure will be returned. 

    //my c-structure contains these fields. 

    //  typedef struct container 
    //  { 
    //    char Name[20]; 
    //    void *VoidData; 
    //    struct container *Link; 
    //  }  
    //    Node; 

私のC#変数 'ret'は 'IntPtr'型で、この構造体へのポインタを取得しました。 'NodeSearch'メソッドから返されたアドレスを持ちます。

これをC#フォームアプリケーション(コンソールアプリケーションでも)にアクセスする方法は?私は初心者です

[0]、ret-> VoidDataなどret->名前:

私は、私はこのように使用することはできませんと思います!私を喜ばせることができますか?

+0

このhttp://blogs.msdn.com/b/jaredpar/archive/2008/11/05/dereference-a-double-intptr.aspx – Adam

+0

に感謝の返事をいただきました。これは私のために便利です。 – SHRI

答えて

3

C#で互換性のあるstruct定義を作成し、Marshalクラスを使用して、ポインタを構造体にマーシャリングする必要があります。

構造体の定義は次のようになります。

[StructLayout(LayoutKind.Sequential)] 
struct Container 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, CharSet = CharSet.Ansi, SizeConst = 20)] 
    string Name; 
    IntPtr VoidData; 
    IntPtr Link 
} 

あなたはその後、次のような方法で、この構造体へのポインタをマーシャリングすることができるはずです。

var ret = NodeSearch(IntPtr.Zero, "key_string"); 
var retContainer = (Container)Marshal.PtrToStructure(ret, typeof(Container)); 

するために、リンクまたは空データを取得する場合は、Marshal.PtrToStructureに電話する必要があります。

+0

お返事ありがとうございました。私はこれを通過し、あなたに戻ってきます。これは私の非常に最初の質問です 'スタックオーバーフロー'。ありがとう。 – SHRI

関連する問題