当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 两个窗口程序(进程)之间的通信

两个窗口程序(进程)之间的通信

2018年04月02日  | 移动技术网IT编程  | 我要评论

科比,我能歘 原唱,男篮全运会

   两个进程或者说两个窗口程序之间如何交换信息呢?Windows提供了一个消息机制WM_COPYDATA,可以在两个窗口之间交换数据。WM_COPYDATA消息在两个窗口程序之间传递一个预定义的数据结构COPYDATASTRUCT。
typedef struct tagCOPYDATASTRUCT
{
  DWORD dwData;
  DWORD cbData;
  PVOID lpData;
} COPYDATASTRUCT;
dwData为32位的自定义数据,lpData为指向数据的指针,cbData为lpData指针指向数据内存的大小(字节数)。

  发送WM_COPYDATA消息只能用SendMessage而不能用PostMessage,原因是WM_COPYDATA发送的数据是以内存映射文件形式发送的,用PostMessage后内存映射文件的句柄会失效了,造成数据丢失。

发送方窗口程序(进程)的代码

class TForm1 : public TForm
{
        __published:    // IDE-managed Components
            TEdit *edt1;
            TButton *btn1;
            void __fastcall btn1Click(TObject *Sender);
       private:            // User declarations
        public:        // User declarations
            __fastcall TForm1(TComponent* Owner);
            char *cpSendStr,cSendStr[512];
            COPYDATASTRUCT pCopyData;
};
//-----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
       cpSendStr = cSendStr;
       cpSendStr = "Losng";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btn1Click(TObject *Sender)
{
         HANDLE fm;
         fm = FindWindow(NULL,"Recemess");
         if (fm != NULL)
             {
                 pCopyData.dwData = 0;
                 if(edt1->Text != "") cpSendStr = edt1->Text.c_str() ;
                 pCopyData.lpData = cpSendStr ;
                 pCopyData.cbData = strlen(cpSendStr);
                 SendMessage(fm,WM_COPYDATA,0,LPARAM)&pCopyData);
             }
         else ShowMessage("没有找到接收窗口!");
}
//-----------------------------------------------------------------------
                        

 

接收窗口程序(进程)代码

class TForm1 : public TForm
{
  __published:    // IDE-managed Components
        TEdit *edt1;
  private:          // User declarations
  public:           // User declarations

       void __fastcall OnWMCopyData(TMessage &Msg);
      BEGIN_MESSAGE_MAP
          VCL_MESSAGE_HANDLER(WM_COPYDATA,TMessage,OnWMCopyData);
      END_MESSAGE_MAP(TForm)
      __fastcall TForm1(TComponent* Owner);

};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   this->Caption = "Recemess";
}
//---------------------------------------------------------------------------
 void __fastcall TForm1::OnWMCopyData(TMessage &Msg)
 {
   char *cpSendStr,cSendStr[512];
   cpSendStr = cSendStr;
   bool flag = false ;
   if ( Msg.Msg == WM_COPYDATA )
     {
        COPYDATASTRUCT* pCopyData = (COPYDATASTRUCT* )Msg.LParam ;
        cpSendStr = (char *)pCopyData->lpData;
        edt1->Text = cpSendStr ;
        flag = true ;
     }
   if (!flag)
     {
        TForm::WndProc(Msg);
     }
 }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网