我现在想VC++发送消息,发送的是一个结构,里面有字符串型、整型和布尔型值,对于整型和布尔型都没有问题,但对于字符串型的显示为乱码,有没有解决办法?或者有没有相关代码,包括发送和接收代码,谢谢

解决方案 »

  1.   

    因为C# 没指针。
    一般我调用C++ 遇到需要传字符串类型的
    我就将 字符串变量 赋值给 STRINGBUILDER 类型 然后将这个变量赋值过去就可以了。
      

  2.   

    同意楼上,MSDN上也推荐用SB平台调用字符串传参
      

  3.   

    编码方式的问题吧C#一个CHAR是两个字节的长度,C++如果不是宽字符就默认是一个字节
      

  4.   

    可以在C#端控制好编码方式,比如这样:byte[] b = Encoding.GetEncoding("gb2312").GetBytes(myString);这样得到的byte数组传给C++就刚好能转化成字符串了
      

  5.   

    我的C#代码如下:
       [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string
            lpWindowName); [StructLayout(LayoutKind.Sequential)]
            public struct COPYDATASTRUCT
            {
                public int dwData;
                public int cbData;
                public int lpData;
            }
            [DllImport("user32", EntryPoint = "SendMessageA")]
            public static extern int SendMessage(int Hwnd, int wMsg, int wParam, ref COPYDATASTRUCT lParam);
            const int WM_COPYDATA = 0x004A;   [StructLayout(LayoutKind.Sequential)]
            public struct tagCOPY
            {
                public int a1;
                public int a2;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
                public string szEvent;
                public bool bEnd;
            }
     private void button1_Click(object sender, EventArgs e)
            {
                          try
                {                COPYDATASTRUCT SendData = new COPYDATASTRUCT();                tagCOPY h = new tagCOPY();
                    h.a1 = 13;
                    h.a2 = 30;
                    h.bEnd = true;
                    h.szEvent = "sss" + '\0';                int size = Marshal.SizeOf(typeof(tagCOPY));
                    byte[] Bytes = new byte[size];
                    //根据定义的尺寸分配内存块
                    GCHandle GC = GCHandle.Alloc(Bytes, GCHandleType.Pinned);
                    IntPtr ptr1 = GC.AddrOfPinnedObject();
                    //获得Struct对应的IntPtr
                    Marshal.StructureToPtr(h, ptr1, false);
                    SendData.lpData = ptr1.ToInt32();
                    SendData.cbData = size;                int intHWnd1 = FindWindow(null, "12345");
                    if (intHWnd1 > 0)
                    {
                        SendMessage(intHWnd1, WM_COPYDATA, 0, ref (SendData));
                    }            }
                catch
                { }        }
    C++接收消息代码如下:
    typedef struct tagCOPY 
    {
        int a1;
        int a2;
    LPTSTR szEvent;
    BOOL bEnd;
    } VcCOPY;BOOL CMy22Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
    // TODO: Add your message handler code here and/or call default
    VcCOPY *Strsss;
      Strsss = (VcCOPY *)pCopyDataStruct->lpData;
    return CDialog::OnCopyData(pWnd, pCopyDataStruct);
    }在C++接收到的Strsss 结果为空或者乱码,请问如何解决?