public struct _MSG_BODY_USER
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string szStuID;
} _MSG_BODY_USER user = new _MSG_BODY_USER();user.szStuID = userid;
要将user传给一个ref int的变量pData ,其作用是取出该结构体的首地址! 传到一个c++的ocx控件中去,该控件是根据地址读取值的!

解决方案 »

  1.   

     传到一个c++的ocx控件中去不明白,到底是C#的,还是C++的呢?
      

  2.   

    把对应ref int 的接口改成ref _MSG_BODY_USER
    然后传递ref user
      

  3.   

    用c++写的一个控件  我要用c#调用里面的函数 转成c#的类型是ref int类型  我要将一个结构体里的数据通过调用那个c++的控件传过去!  怎么实现将上面写的结构体变量user 传到ref int类型的pData里面去!清楚了没?
      

  4.   

    控件里面因为用的是ocx 所以没有提供ref 结构体这样的类型!
      

  5.   

    即使C++的头文件是int*
    你在C#里也可以声明成ref _MSG_BODY_USER
    都来表示指针么
    你的C++里不用管_MSG_BODY_USER是什么,它不过表示个地址,或者说指针不是让你改C++的头文件,是让你改c#的原型声明
      

  6.   

    _MSG_BODY_USER user = new _MSG_BODY_USER(); 
    user.szStuID = userid;int size = Marshal.SizeOf(user);
    IntPtr ps = Marshal.AllocHGlobal(size);
    Marshal.StructureToPtr(structure, ps , false); 
    int ret = CVSINTERFACELib.CvsInterface.OperateUser( ref ps.ToInt32() , size);
      

  7.   

    楼上的structure 是什么?  是 user吗?   如果在那个 CVSINTERFACELib.CvsInterface.OperateUser()中的ref 后面必须接可以赋值的变量,如果是ps.ToInt32() 就会报错!
      

  8.   

    如果int p =ps.ToInt32(); 
    int ret = CVSINTERFACELib.CvsInterface.OperateUser( ref ps.ToInt32() , size);会插入乱码   何解 - -!
      

  9.   


                                                    int size = Marshal.SizeOf(user);                                                IntPtr structPtr = Marshal.AllocHGlobal(size);
                                                    Marshal.StructureToPtr(user, structPtr, false);
                                                    int p = structPtr.ToInt32();                                            int j = axCvsInterface1.OperateUser(ip1, id, ref p, size);
    这样的会插入乱码 就是地址不对 !
      

  10.   

    你这个ocx控件,有没有什么特殊用途,比如关联数据库、与硬件通信等,
    如果没有,你就发给我,我来帮你用用。:[email protected]
      

  11.   


    考虑一下,是不是你的字符串,编码不正确
    也许你的C++程序用的不是UTF-8,而C#默认是用UTF-8你再给user赋值时,最好先转换一下如
    user.szStuID = Encoding.GetEncoding("GB2312").GetString(Encoding.UTF8.GetBytes("你的字符串"));