CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

两进程间消息收发(有源码,帮调下,谢谢了)

楼主WYJBCB(阿菜)2005-08-04 08:47:22 在 C++ Builder / 基础类 提问

现在的问题是,总收不到消息,不知为什么,以下代码是照着论坛里的例子做的,但为什么不行呢?哪个老大帮调下,谢谢了  
  发进程:  
  #define   WM_MYMESS   WM_USER+100  
  Button1   Click事件:  
  SendMessage(Form1->Handle,WM_MYMESS,0,0);  
   
  收进程:  
  .h文件  
  #define   WM_MYMESS   WM_USER+100  
  void   __fastcall   TForm1::receive(TMessage   &msg);  
  BEGIN_MESSAGE_MAP  
  MESSAGE_HANDLER(WM_MYMESS,TMessage,receive)  
  END_MESSAGE_MAP(TForm)  
   
  .cpp文件  
  void   __fastcall   TForm1::receive(TMessage   &msg)  
  {  
    ShowMessage("收到消息");  
  }  
   
  问题点数:40、回复次数:7Top

1 楼setdefault(山转水也转)回复于 2005-08-04 09:02:28 得分 0

SendMessage(Form1->Handle,WM_MYMESS,0,0);  
  是否此处正确的指定了接收窗体的Handle?Top

2 楼FengSC(小猪快跑)回复于 2005-08-04 09:19:41 得分 0

这样写没错,可能是其他问题,我有个QQ群(12694434),你加进来把代码发给我,帮你看看。Top

3 楼constantine(飘遥的安吉儿)回复于 2005-08-04 09:25:49 得分 0

.h  
  //---------------------------------------------------------------------------  
   
  #ifndef   Unit1H  
  #define   Unit1H  
  //---------------------------------------------------------------------------  
  #include   <Classes.hpp>  
  #include   <Controls.hpp>  
  #include   <StdCtrls.hpp>  
  #include   <Forms.hpp>  
   
  #define   WM_COMM   WM_APP+100  
  //---------------------------------------------------------------------------  
  class   TForm1   :   public   TForm  
  {  
  __published:   //   IDE-managed   Components  
                  TButton   *Button1;  
                  TButton   *Button2;  
                  TButton   *Button3;  
                  void   __fastcall   Button1Click(TObject   *Sender);  
                  void   __fastcall   Button2Click(TObject   *Sender);  
                  void   __fastcall   Button3Click(TObject   *Sender);  
  private:  
                  bool   ShowProcess(HWND   Whandle);   //   User   declarations  
  public:     //   User   declarations  
                  __fastcall   TForm1(TComponent*   Owner);  
  };  
  //---------------------------------------------------------------------------  
  extern   PACKAGE   TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  #endif  
   
  .cpp  
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "Unit1.h"  
   
  #include   "Windows.h"  
  #include   "Messages.hpp"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
                  :   TForm(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
                  HWND   whd;  
                  whd   =   FindWindow(NULL,"Receiver");  
                  ShowProcess(whd);  
                  ::SendMessage(whd,WM_COMM,0,0);  
  }  
  //---------------------------------------------------------------------------  
  bool   TForm1::ShowProcess(HWND   Whandle)  
  {  
                  //TODO:   Add   your   source   code   here  
                  bool   rtn   =   false;  
                  try{  
                                  ShowWindow(Whandle,SW_RESTORE);  
                                  SetForegroundWindow(Whandle);  
                                  SetActiveWindow(Whandle);  
   
                                  rtn   =   true;  
                  }  
                  catch(...)  
                  {  
                  }  
                  return   rtn;  
  }  
  void   __fastcall   TForm1::Button2Click(TObject   *Sender)  
  {  
                  HWND   whd;  
                  whd   =   FindWindow(NULL,"Receiver");  
                  ShowProcess(whd);  
                  ::SendMessage(whd,WM_COMM,0,1);  
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm1::Button3Click(TObject   *Sender)  
  {  
                  HWND   whd;  
                  whd   =   FindWindow(NULL,"Receiver");  
                  ShowProcess(whd);  
                  ::SendMessage(whd,WM_COMM,1,0);                  
  }  
  //---------------------------------------------------------------------------  
   
  接收的  
   
  .h  
  //---------------------------------------------------------------------------  
   
  #ifndef   ReceiverH  
  #define   ReceiverH  
  //---------------------------------------------------------------------------  
  #include   <Classes.hpp>  
  #include   <Controls.hpp>  
  #include   <StdCtrls.hpp>  
  #include   <Forms.hpp>  
   
  #define   WM_COMM   WM_APP+100  
  //---------------------------------------------------------------------------  
  class   TForm1   :   public   TForm  
  {  
  __published:   //   IDE-managed   Components  
                  TEdit   *Edit1;  
  private:  
                  void   userpro(TMessage   &msg);   //   User   declarations  
  public:     //   User   declarations  
                  __fastcall   TForm1(TComponent*   Owner);  
  protected:  
                  BEGIN_MESSAGE_MAP  
                                  VCL_MESSAGE_HANDLER(WM_COMM,   TMessage,   userpro)  
                  END_MESSAGE_MAP(TForm)  
  };  
  //---------------------------------------------------------------------------  
  extern   PACKAGE   TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  #endif  
   
  .cpp  
  //---------------------------------------------------------------------------  
   
  #include   <vcl.h>  
  #pragma   hdrstop  
   
  #include   "Receiver.h"  
   
  #include   "Windows.h"  
  #include   "Messages.hpp"  
  //---------------------------------------------------------------------------  
  #pragma   package(smart_init)  
  #pragma   resource   "*.dfm"  
  TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
                  :   TForm(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
  void   TForm1::userpro(TMessage   &msg)  
  {  
                  //TODO:   Add   your   source   code   here  
                  if(msg.WParam   ==   0   &&msg.LParam   ==   0)  
                                  Edit1->Text   =   "命令一";  
                  if(msg.WParam   ==   0   &&   msg.LParam   ==   1)  
                                  Edit1->Text   =   "命令二";  
                  if(msg.WParam   ==   1   &&   msg.LParam   ==   0)  
                                  Edit1->Text   =   "命令三";  
  }  
   
   
  Top

4 楼WindYou(WindYou)回复于 2005-08-04 09:47:53 得分 0

从代码上看,没有什么大问题。建议调试一下下面的代码,看FindWindow   返回的whd   是否是空值,如果是的话,就是你接受端的窗体名称不是"Receiver"。  
   
  HWND   whd;  
                  whd   =   FindWindow(NULL,"Receiver");  
                  ShowProcess(whd);  
                  ::SendMessage(whd,WM_COMM,0,0);Top

5 楼titan_ysl(泰坦)回复于 2005-08-04 11:55:05 得分 0

楼主这段代码是两线程间消息收发用的。  
  看看   WM_USER   消息的说明,  
  WM_USER   through   0x7FFF   Integer   messages   for   use   by   private   window   classes.  
  其它的进程是接收不到WM_USER消息的。  
   
  下面给出功能更强的,不同进程的数据传递方法(WM_COPYDATA消息)。  
   
  发送方:  
  .cpp   File  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
      COPYDATASTRUCT   cds;  
   
      AnsiString   Data=Edit2->Text;//"Just   a   test";  
   
      cds.dwData=sizeof(COPYDATASTRUCT);  
      cds.cbData=Data.Length();  
      cds.lpData=(LPVOID)Data.c_str();  
       
      HWND   hWnd=::FindWindow(NULL,"接收方窗口的标题");  
      if(hWnd)   ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cds);  
   
      //向目标窗口发消息WM_COPYDATA  
      SendMessage(hWnd,WM_COPYDATA,(WPARAM)NULL,(LPARAM)&cds);  
  }  
   
   
  接收方:  
  .h   File  
   
  protected:  
        virtual   void   __fastcall   WndProc(TMessage   &Message);  
   
   
  .cpp   File  
   
  void   __fastcall   TForm2::WndProc(TMessag   &Message)  
  {  
    if(Message.Msg==WM_COPYDATA)  
    {  
          COPYDATASTRUCT   *cds;  
          char*   DataBuf;  
   
          cds=(COPYDATASTRUCT*)Message.LParam;  
          DataBuf=new   char[cds->cbData];  
          CopyMemory(DataBuf,cds->lpData,cds->cbData);  
   
          AnsiString   Str=AnsiString(DataBuf);  
          Memo1->Lines->Add("Str="+Str);  
   
          delete[]   DataBuf;  
    }  
    TForm::WndProc(Message);  
  }  
   
   
  Top

6 楼WYJBCB(阿菜)回复于 2005-08-04 16:58:39 得分 0

To     FengSC(小猪快跑)   :  
  我晚上回家后加你的群吧,   谢谢了  
  公司不让上网   ,真是郁闷Top

7 楼WYJBCB(阿菜)回复于 2005-08-06 21:39:38 得分 0

我用了各位老大的方法,但没有一个行,真是怪了,Top

相关问题

  • B进程怎么样接收A进程发来的消息啊?(有源码,帮看下,谢谢)
  • 求跨进程hook api的源码。
  • 求最简单的smtp接收发送信件的源码!
  • 急!那位有能收发邮件附件的程序源码?
  • 100分急求手机收发短信源码!!!
  • 惊爆::100分急求Linux下的邮件收发JSP源码
  • 如何在DLL中收发消息?!!!
  • 如何得到另一个进程收发的数据
  • 请问哪位师兄有收发电子邮件的程序(含源码)?
  • 100分求解:简单的smtp接收发送信件的源码

关键词

  • 消息
  • 代码
  • whd
  • tform
  • fastcall
  • showprocess
  • mymess
  • whandle
  • tmessag
  • wm

得分解答快速导航

  • 帖主:WYJBCB

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo