日期:2014-05-17  浏览次数:21317 次

C# win32 API PostMessage在2个进程间能发送字符串吗?
一个进程间互相通信的问题:PostMessage字符串的传递

代码如下,
  发送方(a.exe):  
  [DllImport("user32.dll",CharSet=CharSet.Auto )]
  public static extern int PostMessage(int hwnd, int msg, int wparam, StringBuilder lParam);


  PostMessage(345818381, 0x77, 0,new StringBuilder("abcdefg"));


  接收方(b.exe):
  protected override void DefWndProc(ref System.Windows.Forms.Message m){
  switch (m.Msg){
  case 0x77:
  String info = Marshal.PtrToStringAuto(m.LParam);
  break;
  } 
  }
问题,info的结果为空""值,而不是"abcdefg";网上有传说,消息被处理被,"abcefg"的内存已被释放,请问各大侠是怎么回事咯,该怎么传递才能成功传递字符串?
网上苦寻结果,大多是复制来复制去的文章,无具体完整的实例,只好在这里寻求帮助了。
(注:请不要让我改用SendMessae,这里我用PostMessage(或其它发送完消息立即返回的api)会更好一点),谢谢!

------解决方案--------------------
因为PostMessage只是将消息放入对方的消息队列,在对方进程读取到字符串之前也要注意GC会移动字符串的内存,所以应该用Marshal.AllocHGlobal或者Marshal.AllocCoTaskMem为字符串分配空间,对方进程在读取完毕之后最好回发一个消息,发送方收到消息后释放内存。