C#如何使用COPYDATASTRUCT传递一个自定义结构

阳光919 2009-02-03 10:07:57
比如如下一个结构:(C#中定义)
[StructLayout(LayoutKind.Sequential)]
public struct Mydata
{
public string str1;
public string str2;
public string str3;
public int str4;
public bool str5;
}
结构原形我在Delphi中已经声明,请教各位,如何通过使用WM_COPYDATA消息,在两个程序间传递这个结构???
请大家不吝赐教!!!
...全文
1741 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinarenjf 2010-04-07
  • 打赏
  • 举报
回复
顶......
feiyun0112 2009-02-03
  • 打赏
  • 举报
回复
一样一样的啊
阳光919 2009-02-03
  • 打赏
  • 举报
回复
感谢 feiyun0112
看了您的文章,我受益匪浅!
再请教一下,如果是给其他程序,比如delphi开发的程序,或者VB开发的程序,它们给C#窗体发送WM_COPYDATA 消息,或者反过来,C#给它们发送WM_COPYDATA 消息,接收的时候应该注意些什么呢??????
feiyun0112 2009-02-03
  • 打赏
  • 举报
回复
http://www.cnblogs.com/feiyun0112/archive/2007/02/01/637280.html
阳光919 2009-02-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dayizhixiaotutu 的回复:]
C# code发送方
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;

}
const int WM_COPYDATA = 0x004A;

[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd, // handle…
[/Quote]

我问的是如何传递一个结构,我通常使用的是用C#写接口,在里面定义函数,通过函数参数传递结构.但是那样很麻烦,我想用WM_COPYDATA 消息函数来实现,用这个消息传递单个的字符串我已经实现了,我就是不知道怎么用它来传递一个结构????
typedef struct tagCOPYDATASTRUCT{
DWORD dwData;//用户定义数据
DWORD cbData;//数据大小
PVOID lpData;//指向数据的指针
}COPYDATASTRUCT;
该结构用来定义用户数据。
我不知道在C#里,如何实现让lpData成为指向数据的指针的指针,还有就是接收的时候如何接收指向指针的指针???
dayizhixiaotutu 2009-02-03
  • 打赏
  • 举报
回复
接受
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;

}
const int WM_COPYDATA = 0x004A;
public Form1()
{
InitializeComponent();
}

protected override void DefWndProc(ref Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
COPYDATASTRUCT mystr = new COPYDATASTRUCT();
Type mytype = mystr.GetType();
mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
this.textBox1.Text = mystr.lpData;
break;
default:
base.DefWndProc(ref m);
break;
}
}
阳光919 2009-02-03
  • 打赏
  • 举报
回复
自己顶一下!
dayizhixiaotutu 2009-02-03
  • 打赏
  • 举报
回复
发送方
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;

}
const int WM_COPYDATA = 0x004A;

[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
ref COPYDATASTRUCT lParam // second message parameter
);

[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern int FindWindow(string lpClassName, string
lpWindowName);


public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
int WINDOW_HANDLER = FindWindow(null, @"ReceiveMessage");
if (WINDOW_HANDLER == 0)
{
return;
}
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 + 1;
SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);

}

}
阳光919 2009-02-03
  • 打赏
  • 举报
回复
定义:
[StructLayout(LayoutKind.Sequential)]
public struct Mydata
{
public string str1;
public string str2;
public string str3;
public int str4;
public bool str5;
}
消息结构定义:
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
发送消息时我这样写的:
COPYDATASTRUCT cd1 = new COPYDATASTRUCT();
Mydata md1 = new Mydata();
...........//给md1结构赋值
IntPtr Buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(md1));
Marshal.StructureToPtr(md1,Buffer,false);
cd1.cbData = Marshal.SizeOf(md1);
cd1.dwData = Buffer;
cd1.lpData = Buffer.ToString();//此处我不知道该怎么写???????
请教,发送还有接收时,应该怎样处理呢?
dayizhixiaotutu 2009-02-03
  • 打赏
  • 举报
回复
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;

}
feiyun0112 2009-02-03
  • 打赏
  • 举报
回复
需要指定string 的大小

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧