在VC++ 6.0下利用訊息實現內部程式通訊 (轉)

worldblog發表於2007-12-09
在VC++ 6.0下利用訊息實現內部程式通訊 (轉)[@more@]資訊產業部電子第二十二研究所 郎銳   內部程式間通訊和資料有多種方式:訊息、共享、匿名(命名)管道、郵槽、套接字等多種技術。其中利用訊息機制實現IPC雖然同其他方法相比有交換的資料量小、攜帶的資訊少等缺點,但由於其實現方便、應用靈活而廣泛應用於無須大量、頻繁資料交換的內部程式通訊之中,尤其是對於在上層主控與底層工作軟體之間的命令與響應上更能充分顯示其良好的。本文就透過編制一個主控軟體和一個受其操作的底層工作軟體來闡述如何用VC++6.0透過訊息來實現內部程式通訊。 一、Windows訊息機制 Windows是一種面向的體系結構,Windows環境和應用都是透過訊息來互動的。Windows應用程式開始後,Windows為該程式建立一個"訊息佇列(message queue)",用以存放郵寄給該程式可能建立的各種不同視窗的訊息。訊息佇列中訊息的結構(MSG)為: typedef struct tagMSG{ HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; D time; POINT pt; }MSG; 其中第一個成員變數是用以標識接收訊息的視窗的視窗控制程式碼;第二個引數便是訊息標識號,如WM_PAINT;第三個和第四個引數的具體意義同message值有關,均為訊息引數。前四個引數是非常重要和經常用到的,至於後兩個引數則分別表示郵寄訊息的時間和游標位置(螢幕座標)。把訊息傳送到應用程式有兩種方法:一種是由系統將訊息"郵寄(post)"到應用程式的"訊息佇列"這是"進隊訊息" 有對應的:    PostMessage(),此函式不等待該訊息處理完就返回;而另一種則是由系統在直接視窗函式時將訊息"傳送(send)"給應用程式的視窗函式,屬於"不進隊訊息"對應的函式是SendMessage()其必須等待該訊息處理完後方可返回。   二、主控程式的實現 (1)新建一工程:Sender,選取MFC AppWizard(exe)。 (2)第二步選取Single document(單文件)。 (3)其餘幾步均為確省值。 (4)新增三個選單"命令一"、"命令二"、"命令三"及與之對應的函式: OnSendComm1() { CString str="Receiver"; CWnd *pWnd=CWnd::FindWindow(NULL,str); if(pWnd) pWnd->SendMessage(WM_COMM,0,0); } OnSendComm2() { CString str="Receiver"; CWnd *pWnd=CWnd::FindWindow(NULL,str); if(pWnd) pWnd->SendMessage(WM_COMM,0,1); } OnSendComm3() { CString str="Receiver"; CWnd *pWnd=CWnd::FindWindow(NULL,str); if(pWnd) pWnd->SendMessage(WM_COMM,1,0); } (5)在SenderView.h中新增自定義訊息:#define WM_COMM WM_USER+100編譯完成即可。   三、底層工作程式的實現 (1)新建工程Receiver、仍是單文件。 (2)在CReceiverApp類的InitInstance()函式末尾新增: m_pMainWnd->SetWindowText("Receiver"); 用以指定底層工作程式的視窗標題,以便主控程式能根據標題獲取到此視窗的視窗控制程式碼。 (3)在MainFrm.h中新增自定義訊息:#define WM_COMM WM_USER+100。 (4)新增自定義訊息WM_COMM的訊息對映: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove map macrhere. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP ON_MESSAGE(WM_COMM,OnSendMsg) END_MESSAGE_MAP() (5)完成訊息響應函式OnSendMsg() void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam) { if(wParam==0 && lParam==0) AfxMessageBox("主控程式傳送命令一!"); if(wParam==0 && lParam==1) AfxMessageBox("主控程式傳送命令二!"); if(wParam==1 && lParam==0) AfxMessageBox("主控程式傳送命令三!"); } 我們便可以透過辨別訊息的兩個訊息引數來區分主控程式傳送的是哪一個命令從而可以執行相應的操作。執行主控程式和底層工作程式由於本程式採用的是SendMessage()所以當主控程式傳送訊息給底層工作程式時,底層工作程式彈出響應的對話方塊,在沒有關閉對話方塊前此訊息未處理完,SendMessage()也就沒有執行完,所以主控程式呈阻塞狀態,如改用PoseMessage()則不會發生阻塞,具體選用哪個函式還應根據實際要求靈活掌握。   結論: 透過上面的例項可以看出利用訊息進行程式間通訊不失為一種便捷的方法,程式間的資料交換量不大卻能完成相當的功能,上下層次有著明顯的介面,上層和底層只透過這個介面進行通訊,因此只要對上下層程式制定好規範詳盡的便可編制出協調性很好的軟體控制系統。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989988/,如需轉載,請註明出處,否則將追究法律責任。

相關文章