我需要两个进程间通讯,这两个进程分别是两个窗体。但在收发数据的时候出现问题了。窗体A的代码如下:private void button4_Click(object sender, EventArgs e)
        {
            IntPtr hwndCalc = (IntPtr)0x0;
            Process[] pros = Process.GetProcesses(); 
            for (int i = 0; i < pros.Length; i++)
            {
                if (pros[i].ProcessName == "窗体B") 
                {
                    hwndCalc = pros[i].MainWindowHandle;                 }
            }
            //上面获得的句柄没有错。
           string s="abcd";
           byte[] tmp = System.Text.Encoding.Default.GetBytes(s);
           IntPtr lpData = Marshal.AllocHGlobal(tmp.Length);           Marshal.Copy(tmp, 0, lpData, tmp.Length);
           SendMessage(hwndCalc, 0x74, 0,lpData);
        }
窗体B的代码如下:protected override void DefWndProc(ref Message m)
        {
            if (m.Msg == 0x74)
            {
                    byte[] tmp = new byte[4];
                    Marshal.Copy(m.LParam, tmp, 0, tmp.Length);                    string str = System.Text.Encoding.Default.GetString(tmp);
                    textBox1.Text = str;
            }
           base.DefWndProc(ref m);
        }
问题,能接受到消息,但获取不到数据。主要在窗体B的这行代码Marshal.Copy(m.LParam, tmp, 0, tmp.Length);---------------获得都是{0,0,0,0}不管问题能不能解决,先谢谢大家!

解决方案 »

  1.   

    窗体A用的是SendMessage来发送消息,窗体B用回调函数来接受信息,信息可以接受到
      

  2.   

    Marshal主要对IntPtr类型的指针进行操作按理说应该能接收到数据啊,是不是在 m.WParam里?
      

  3.   

    我只传了内存地址,而窗体B接受到后,再去内存找,接受到的内存地址正确,我已经验证过无数次了。但就是Marshal.Copy这个方法却什么也得不到
      

  4.   

    Marshal.AllocHGlobal(tmp.Length);  没有对应的FreeHGlobal,严重内存泄露
      

  5.   


    但是把代码“Marshal.Copy”放入窗体A中执行,却能够读取到正确的数据。
    是否Marshal.Copy有进程限制??只能再同一个进程中?而不能获得另外进程的内存数据?
      

  6.   

    http://wenku.baidu.com/view/5f7c4ffd0242a8956bece453.html
      

  7.   

    Marshal不是用在进程中通信的,那个是用在非托管和托管资源之间的内存拷贝,必须同一进程,实现地址级的数据访问而不是对象级的。你如果要进程间通信,请使用WCF,不要用内存共享,那个是C++年代才使用的。
      

  8.   

    人家只要两个进程数据共享,跟WCF啥关系。再说了内存共享C#完全是可以用的。