当前位置:编程学习 > C#/ASP.NET >>

C# API SendMessage 发送字符串已成功,请问可以发送对象吗

RT
C# API SendMessage 发送字符串已成功,请问可以发送对象吗

Form1
 private void SendImformation()
        {
            int WINDOW_HANDLER = FindWindow(null, "Form1");
            if (WINDOW_HANDLER == 0)
            {
            }
            else
            {
                byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);
                int len = sarr.Length;
                CopyDataStruct cds;
                cds.dwData = (IntPtr)100;
                cds.lpData = this.textBox1.Text;
                cds.cbData = len + 8;
                SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);


                //this.pictureBox1.Image = Image.FromFile(SysParas._sPath);
            }
        }

Form2
 protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                //接收自定义消息 USER,并显示其参数
                case WM_COPYDATA:
                    CopyDataStruct mystr = new CopyDataStruct();
                    Type mytype = mystr.GetType();

                    mystr = (CopyDataStruct)m.GetLParam(mytype);

                    string[] strArray = mystr.lpData.Split(',');
                    if (strArray.Length == 2)
                    {
                        this.textBox1.Text = strArray[0];
                        this.textBox2.Text = strArray[1];
                    }
                    break;
                default:
                    base.DefWndProc(ref m);
                    break;

            }
        }
上面代码是发送字符串成功,请大侠帮忙,怎么发送对象?
--------------------编程问答-------------------- 把对象给序列化了不行吗 --------------------编程问答-------------------- 序列化结果是byte[],怎么传呢?
我只会传string --------------------编程问答-------------------- 用byte创建message --------------------编程问答-------------------- 用byte创建message?
可以给个简单的代码吗? --------------------编程问答-------------------- 对象是有边界的

--------------------编程问答-------------------- 所有 win32 api 的 参数, 返回值

都是 32 位的一个数值
--------------------编程问答-------------------- 使用指针操作.

public  IntPtr ClassToIntPtr(ProcessArgs arg,out int length)
{
byte [] temp = SerializationUtility.ToBytes(arg);
length = temp.Length;
IntPtr ptr = Marshal.AllocHGlobal(length);
Marshal.Copy(temp,0,ptr,length);
return ptr;
}

public  ProcessArgs IntPtrToClass(IntPtr ptr,int length)
{
byte [] temp = new byte[length];
Marshal.Copy(ptr,temp,0,length);
return SerializationUtility.ToObject(temp) as ProcessArgs;
}



ProcessArgs 为可序列化的类,SerializationUtility是二进制序列化类,要实现.
SendMessage后调用Marshal.FreeHGlobal释放掉ClassToIntPtr返回的指针


lpData声明成IntPtr. 
传递任意可序列化类 --------------------编程问答--------------------
引用 2 楼 yws215076503 的回复:
序列化结果是byte[],怎么传呢?
我只会传string


 byte的指针 --------------------编程问答-------------------- public  IntPtr ClassToIntPtr(ProcessArgs arg,out int length)
        {
            byte [] temp = SerializationUtility.ToBytes(arg);
            length = temp.Length;
            IntPtr ptr = Marshal.AllocHGlobal(length);
            Marshal.Copy(temp,0,ptr,length);
            return ptr;
        }

        public  ProcessArgs IntPtrToClass(IntPtr ptr,int length)
        {
            byte [] temp = new byte[length];
            Marshal.Copy(ptr,temp,0,length);
            return SerializationUtility.ToObject(temp) as ProcessArgs;
        }


Length是什么长度啊?
谢谢 --------------------编程问答-------------------- 必须序列化~~~ --------------------编程问答-------------------- 序列化我明白。就是序列化后得到byte[].
数组类型我不会传。 --------------------编程问答-------------------- SerializationUtility
命名空间是什么?我怎么找不到Using --------------------编程问答-------------------- length是你传递的byte数组的长度.

这里不是传的数组类型,传的是一个IntPtr指针.相当于结构原形里的void*,通过指针和数据长度,才能得到byte数组 --------------------编程问答-------------------- 不好意思,我上csdn是一阵阵的,所以你的留言没看到

SerializationUtility是我项目中用来进行二进制序列化与反序列化的类,你需要自己写一个

将类序列化成字节数组并将其拷贝到一块内存区域后,用一个指针记录该区域的首地址,而该内存区域的大小,就是字节数组的长度,这个长度需要记录,可以搜索查看一下 CopyDataStruct的c语言结构.

因为通过指针,仅仅是传递了一块内存区域的首地址,所以,到底从这块区域读取多少个byte,需要一个数字也就是length来记录.

通过 首地址+字节数 来读取类序列化后的数据,然后将其反序列化成类对象
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,