现有一个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[]上,我要怎么变通解决这个问题呢。
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[]上,我要怎么变通解决这个问题呢。
BOOL GetData(void* pCommand, void* pDataBuffer, int nSize)
还是不能正确获取值,郁闷!
要注意编码方式及长度
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;
}试一下:)
在这里
GetData(m_pReturn, &posCard, 0);
系统编译提示不能获取posCard的地址和指针啊!
但确不能返回到正确的值,不知道怎么回事
那你看我这里要怎么修改对应啊?
这是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);
public static extern bool GetData(IntPtr pCommand, ref POSCARD posCard, int nSize);
试一试
可以的话尽量少用unsafe :)
[DllImport("ICDM.dll")]
public static extern bool GetData(IntPtr pCommand, Intptr pDataBuffer, int nSize);然后调用之后
POSCARD posCard = (POSCARD) Marshal.PtrToStructure(pDataBuffer);就可以得到你要读的数据了