C/C++中的定义如下:
/* 结构体定义*/
typedef struct _tag_RECORD
{
    struct _tag_RECORD *next;
    unsigned short *pName;
}RECORD_T, *P_RECORD_T;/* 函数声明 */
int GetRecords(P_RECORD_T ppRecord[]);在C#中需要调用GetRecords来获取相应的记录,pName内存应该是在dll中申请的.我在C#中定义结构体如下:
    public struct RecordType
    {
        public IntPtr next;        [MarshalAs(UnmanagedType.LPWStr)]
        public string pName;
    }但是接下来却不知道怎么写了.请问,如何在C#中调用GetRecords获取到记录的名字呢?谢谢.

解决方案 »

  1.   

    http://www.dreamdu.com/blog/2008/04/25/cs_cpp_functionpointer/
    这里有篇关于C#调用C++动态链接库函数指针与函数结构的文章,希望对你有帮助。
      

  2.   

    [DllImport("**.dll")]//你要导入的库函数
     public static extern int GetRecords(ref RecordType ppRecord )
      

  3.   

        今天终于解决了这个问题,LS的都没有正确回答.不管怎么样,还是谢谢了.可惜不能给自己分数呀.哈哈.
    /* 声明 */
    [DllImport("***.dll")]
    public static extern int GetRecords(IntPtr[] ppRecord);int cnt = 1; //根据查询情况赋值,这里只查一个
    int result = -1;
    IntPtr[] record = new IntPtr[cnt]; //申请内存空间record[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(RECORD_T)) * cnt); //这样是okay的?我尝试了是没有问题的,但不保证
    result = GetRecords(record);
    if(0x00 != result)
    {
        //do something here
        return;
    }
    else
    {
        RECORD_T tagInfo;    for (int i = 0; i < cnt; i++)
        {
            tagInfo = (RECORD_T)Marshal.PtrToStructure((IntPtr)((UInt32)record[i]),
               typeof(RECORD_T));
    //这里就成功获取到了信息了
        }
    }... //more operation hereMarshal.FreeHGlobal(record[0]); //别忘了释放内存,但是我也不确定是否已经全部释放