Holion

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在两个或者说多个应用程序之间使用某个应用程序中定义的消息,那么应将这个消息进行注册,使之成为Windows消息(当然要保证其唯一性),使用RegisterWindowMessage进行注册,下面是两个应用程序(也就是说是两个.exe,不要误解成两个Form). 
Application   1: 
.h   File 
class   TForm1:public   TForm 

private: 
      
public: 
      
protected: 
........... 

.cpp   File 
//I   omit   the   constructor   
void   __fastcall   TForm1::FormCreate(TObject   *Sender) 

        UINT   uMsg=::RegisterWindowMessage( "WM_MYMESSAGE "); 

void   __fastcall   TForm1::Button1Click(TObject   *Sender) 

      HWND   hWnd=::FindWindow(NULL, "Form2 "); 
      if(hWnd)   ::SendMessage(hWnd,uMsg,0,0); 



Application   2: 
class   TForm2:public   TForm 

private: 
.... 
public: 
..... 
protected: 
      virtual   void   __fastcall   WndProc(TMessage   &Message); 
}; 
.cpp   File 
//I   omit   all   other   functions   and   only   write   the   window   procedure 
void   __fastcall   TForm2::WndProc(TMessage   &Message) 

      if(Message.Msg==uMsg) 
      { 
            ShowMessage( "I   received   the   message   defined   in   application1 "); 
            ..................... 
      } 
      TForm::WndProc(Message); 


还有一种方法可以实现在两个进程间通讯,那就是使用WM_COPYDATA消息,在这里也给出代码: 
发送方: 
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); 

接收方: 
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); 


总结一下:

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

被传递的数据中不能带有对象的指针或引用之类的指针型数据,否则这些数据不会被接收应用程序获取到。

被传递的数据在传递过程中,它不能被发送应用程序修改。

接收方认为被传递的数据是只读的,lParam只在消息处理函数中可见,因此接收应用程序不应该释放lParam所占用的程序空间。如果接收应用程序需要在消息处理函数返回后再对传递的数据有处理,可以把传递数据复制到本地的缓冲区中。

posted on 2011-09-20 18:02  Holion  阅读(1743)  评论(0)    收藏  举报