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的 插入乱码是为什么?求解 - -!

解决方案 »

  1.   


    //先把这句改正了再说,难道楼主没有编译过?
    //int j = structPtr.ToInt32(); 
    int p = structPtr.ToInt32();
      

  2.   


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi]
    public struct _MSG_BODY_USER
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
                public string szStuID;
    }
    使用了ByValTStr,请指定CharSet,否则会使用默认的Unicode,导致字符串错误。
      

  3.   

    楼主,不要在发帖了,留点分吧。这个问题,你一下子很难描述清楚,没有深入了解,别人很难知道你的问题所在,我明天用非安全unsafe代码测试,看看行不行。