c++中调用:完全没问题
typedef struct _MSG_BODY_USER
{
char szStuID[DATABASE_USER_SECTION_LEN];
}MSG_BODY_USER, *PMSG_BODY_USER; MSG_BODY_USER msg;
long lErrorCode;
memset((char*)&msg, 0, sizeof(msg));
char szStuID[DATABASE_USER_SECTION_LEN];
char str[] = "28363131";
memcpy(msg.szStuID, str, strlen(str));
lErrorCode = m_CvsCtrl.OperateUser(CVS_IP, CVS_OPT_ADD, (long*)&msg, sizeof(msg));
TRACE("msg resp is: 0x%x\n", lErrorCode);c#调用插入的数据是乱码????! 为什么??
public struct _MSG_BODY_USER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string szStuID;
} _MSG_BODY_USER user = new _MSG_BODY_USER();user.szStuID = userid;int size = Marshal.SizeOf(user);
IntPtr structPtr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(user, structPtr, false); int j = structPtr.ToInt32();
int j = axCvsInterface1.OperateUser(ip1, id, ref p, size); //调用c++的控件函数 ,为什么会插入乱码?// 这个因为是调用的c++ 所以类型不可更改 第三个变量是ref int 类型 没办法才不用 intptr的 插入乱码是为什么?求解 - -!
//先把这句改正了再说,难道楼主没有编译过?
//int j = structPtr.ToInt32();
int p = structPtr.ToInt32();
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi]
public struct _MSG_BODY_USER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string szStuID;
}
使用了ByValTStr,请指定CharSet,否则会使用默认的Unicode,导致字符串错误。