将结构作为intptrs或ref传递给非托管代码

时间:2013-09-27 08:32:16

标签: c# dll struct ref intptr

我一直在尝试将信息传递给c#或从c#传递到c ++ dll。我根本无法改变dll。

基本上,我找到了一种有效的方法 - 但是我不太明白为什么这种方法有效,而其他方法则不然。如果我能得到某种理解,那就太好了。

这是我的工作代码:

public class Helper
{
  [DllImport("C:/abc/abc.dll")]
  static extern int DLL_GetData(ref keyData key, IntPtr stringData);
  // the ref is just a pointer passed in, but is not modified in the dll. the stringData is filled in by the dll, which we then marshal back into a struct      

  public string GetStringData()
  {
    keyData key = new keyData();

    key.DataKey.text = "5555555";
    key.ProdKey.length = 7;

    key.Version.text = "2012";
    key.Version.length = 4;

    IntPtr keyPtr = Marshal.AllocHGlobal(Marshal.SizeOf(key));

    stringData data = new stringData();
    IntPtr dataPtr = Marshal.AllocHGlobal(Marshal.SizeOf(data));

    int status = DLL_GetData(ref key, dataPtr);
    data = (stringData)Marshal.PtrToStructure(dataPtr, typeof(stringData));

    return data.text;
  }

  [StructLayout(LayoutKind.Sequential)]
  public struct keyData
  {
    [MarshalAs(UnmanagedType.Struct)]
    public stringData DataKey;
    [MarshalAs(UnmanagedType.Struct)]
    public stringData Version;
  }

  [StructLayout(LayoutKind.Sequential)]
  public struct stringData
  {
    [MarshalAs(UnmanagedType.LPWStr)]
    public string text;
    public int length;
  }
}

所以,如果我调用GetStringData(),我能够获得所需的字符串。但是,我很困惑为什么只为keyData使用ref,而stringData的IntPtr应该适用于我?

我尝试将两个参数用作ref值,并且都作为IntPtrs使用,但无济于事。真的只是偶然的,我尝试使用一个作为参考,一个作为IntPtr。问题是 - 为什么会这样?我真的很想知道为什么会这样......希望我已经包含了足够的代码和信息。

这是dll函数方法:

DLL_GetData(KEYDATA *key, STRINGDATA *data);

现在,我不知道这个函数的主体是什么(否则我会发布它)。但我希望尝试使用它。

所以STRINGDATA结构:

typedef struct STRINGDATA
{
   unsigned short* text;
   int length; 
}STRINGDATA;

和KEYDATA struct:

typedef strut
{
   STRINGDATA key;
   STRINGDATA ver;
} KEYDATA;

0 个答案:

没有答案