在VC++ 6.0下利用訊息實現內部程式通訊 (轉)
在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在Linux作業系統中實現內部程式通訊(轉)Linux作業系統
- VC++ 串列埠通訊(轉)C++串列埠
- 在如何實現兩個JBoss之間的訊息通訊?
- 如何優雅的實現訊息通訊?
- VC++訊息對映的思考 (轉)C++
- 利用windows api實現程式通訊(命名管道)WindowsAPI
- VC++ 的串列埠通訊 (轉)C++串列埠
- 利用SQL實現通訊錄SQL
- 利用localstorage實現本地訊息快取快取
- 在 OpenResty 裡實現程式間通訊REST
- 程式間通訊--訊息佇列佇列
- RabbitMQ實戰:理解訊息通訊MQ
- iOS:利用訊息轉發機制實現多播委託iOS
- 使用 NSProxy 實現訊息轉發
- Android程式間通訊–訊息機制及IPC機制實現薦Android
- Linux下應用程式開發:QT的內部程式通訊(轉)LinuxQT
- 實現mind+下Easy IoT上mqtt訊息的通訊。MQQT
- 內部通訊服務Factory(WCF)
- Oracle實時程式通訊(轉)Oracle
- 物聯網:實現sIoT配置並實現sIoT上mqtt訊息的通訊MQQT
- golang實現子程式通訊Golang
- Java實現TCP通訊程式JavaTCP
- 利用Storage Event實現頁面間通訊
- 利用飛鴿協議實現通訊功能協議
- Java中利用管道實現執行緒間的通訊(轉)Java執行緒
- RabbitMQ實戰:訊息通訊模式和最佳實踐MQ模式
- js訊息訂閱和釋出實現元件之間通訊JS元件
- 利用VC++程式設計實現程式自動啟動 (轉)C++程式設計
- VC++串列埠通訊程式設計詳解C++串列埠程式設計
- 使用Oracle實現實時通訊(轉)Oracle
- .NET 8 中利用 MediatR 實現高效訊息傳遞
- Flink內部之間的通訊
- workerman 實現訊息推送
- [Akka]傳送一條訊息的內部流程
- 程式間通訊——XSI IPC之訊息佇列佇列
- 網路通訊2:TCP通訊實現TCP
- App如何利用推送訊息有效實現拉新促活?APP
- VC++基礎 判斷鍵盤訊息C++