最近做C/S的程序,不免要遇到窗体及程序间数据的传递,程序间或者进程间数据的封送传递,我知道的方法不多(学习不够啊),我最喜欢用的就是发送WM_COPYDATA消息,这时就要遇到CopyDataStruct结构体了,对于这个结构体的原形,我们并不陌生.
typedef struct tagCOPYDATASTRUCT {
DWORD dwData;
DWORD cbData;
PVOID lpData;
} COPYDATASTRUCT;
dwData是要封送的数据,也可以不用它
cbData是要封送的数据的大小,
lpData是要封送的数据的内存地址
其实有后两个参数,封送数据就可以完成了,下面是我用Delphi程序向C#程序发送数据的代码:
const
WM_COPYDATA = $004A;
Type
TSelCorrelateDatePara1 = packed record
PkF: array [0..19] of char;
PkV: array [0..19] of char;
end;
///数据发送端代码
procedure TForm1.Button4Click(Sender: TObject);
var
pMyCDS: TCopyDataStruct;
SelCorrelateDatePara: TSelCorrelateDatePara1;
hd:HWND;
begin
pMyCDS.cbData := SizeOf(SelCorrelateDatePara);
SelCorrelateDatePara.PkF := String('Hello');
SelCorrelateDatePara.PkV := String('happy new year');
pMyCDS.lpData := @SelCorrelateDatePara;
hd := FindWindow(nil,'好心情');//查找目标窗体
if hd <> 0 then
begin
ShowMessage(inttostr(hd));
SendMessage(hd,WM_COPYDATA,0,integer(@pMyCDS));
end;
end;
下面是C#接收数据的代码:
首先,类外定义:
[StructLayout(LayoutKind.Sequential)]
public struct Mydata11
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string str1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string str2;
}
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public int dwData;
public int cbData;
public int lpData;
}
接收代码:
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_COPYDATA:
MessageBox.Show("信息已经收到");
COPYDATASTRUCT mystr = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
Mydata11 md2 = (Mydata11)Marshal.PtrToStructure((IntPtr)mystr.lpData, typeof(Mydata11));
this.tb1.Text = md2.str1;
this.tb2.Text = md2.str2;
break;
}
base.WndProc(ref m);
}
完毕.