现有一个c++的函数原型,如下
struct POSCARD{
int nFileSort;
int nCardID;
char strName[8];
char strUserKey[4];
int nPosGroup;
int nYear, nMonth, nDay;
int nMoneyCent;
};然后我在c#里的定义,如下
struct POSCARD{
int nFileSort;
int nCardID;
char[] strName;
char[] strUserKey;
int nPosGroup;
int nYear, nMonth, nDay;
int nMoneyCent;             
}在c#的调用:
POSCARD posCard = new POSCARD();
GetData(m_pReturn, &posCard, 0);
编译时提示不能获取posCard的地址或指针,
现在问题就出在结构体的char[]上,我要怎么变通解决这个问题呢。

解决方案 »

  1.   

    这是GetData的函数原型
    BOOL GetData(void* pCommand, void* pDataBuffer, int nSize)
      

  2.   

    找到了一种方法fixed char strName[8],不知道能不能对应上?
    还是不能正确获取值,郁闷!
      

  3.   

    char[] ==> string
    要注意编码方式及长度
      

  4.   

    [StructLayout(LayoutKind.Sequential)]
    struct POSCARD{
    int nFileSort;
    int nCardID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    char[] strName;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    char[] strUserKey;
    int nPosGroup;
    int nYear, nMonth, nDay;
    int nMoneyCent;            
    }试一下:)
      

  5.   

    to:ys119(mars)
    在这里
    GetData(m_pReturn, &posCard, 0);
    系统编译提示不能获取posCard的地址和指针啊!
      

  6.   

    现在只有用fixed char strName[8]这种方式可以引用posCard的地址(&posCard),
    但确不能返回到正确的值,不知道怎么回事
      

  7.   

    在C#中对象引用就相当于地址,你直接GetData(m_pReturn, posCard, 0);不行么?
      

  8.   

    好像不行呀!
    那你看我这里要怎么修改对应啊?
    这是GetData的函数原型
    BOOL GetData(void* pCommand, void* pDataBuffer, int nSize)
    这是我原来的定义
    [DllImport("ICDM.dll")]
    unsafe public static extern bool GetData(void* pCommand, void* pDataBuffer, int nSize);
    现在我改成了
    [DllImport("ICDM.dll")]
    unsafe public static extern bool GetData(void* pCommand, POSCARD posCard, int nSize);
      

  9.   

    [DllImport("ICDM.dll")]
    public static extern bool GetData(IntPtr pCommand, ref POSCARD posCard, int nSize);
    试一试
    可以的话尽量少用unsafe :)
      

  10.   

    如果你是把数据读到pDataBuffer中去的话你可以这样:
    [DllImport("ICDM.dll")]
    public static extern bool GetData(IntPtr pCommand, Intptr pDataBuffer, int nSize);然后调用之后
    POSCARD posCard = (POSCARD) Marshal.PtrToStructure(pDataBuffer);就可以得到你要读的数据了
      

  11.   

    不好意思,有点大意了C中的char对应C#中的sbyte