C# API SendMessage 发送字符串已成功,请问可以发送对象吗
RTC# 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.
传递任意可序列化类 --------------------编程问答--------------------
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#