我试图让2应用程序使用windows消息相互通信。但是,我在分配内存和编组数据期间一直在获取AccessViolationException(试图读取或写入受保护的内存)。通过win消息在应用程序之间进行通信
有人可以向我解释什么是错的或建议更好的方法吗? 谢谢。
编辑:使用WM_COPYDATA建议,但现在我有另一个问题 - 其他应用程序没有收到WM_COPYDATA消息。怎么了?发送味精
代码:用于接收MSG(在其他应用程序)
public const int WM_COPYDATA = 0x004A;
public struct COPYDATASTRUCT
{
public int dwData;
public int cbData;
public DATA lpData;
}
public struct DATA
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=50)]
public char[] msg1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=50)]
public char[] msg2;
}
[DllImport("User32.dll")]
public static extern int SendMessage(int hWnd, int Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
private void button1_Click(object sender, EventArgs e)
{
// data, with null terminated strings
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds.lpData.msg1 = textBox2.Text.PadRight(50, '\0').ToCharArray();
cds.lpData.msg2 = textBox3.Text.PadRight(50, '\0').ToCharArray();
cds.cbData = Marshal.SizeOf(cds.lpData);
int result = SendMessage(hwnd, WM_COPYDATA, System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle, ref cds); // winAPI
}
代码:
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_COPYDATA)
{
// doesn't get into this part
COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
....
}
base.WndProc(ref m);
}
除了'Convert.ToChar(0x0)',你可以编写'“\ 0”'。 – SLaks 2010-01-15 03:56:36
在切换到“WM_COPYDATA”之前,其他应用程序是否收到消息? – SLaks 2010-01-15 14:23:54