程式設計高手 VC 6 0下利用訊息實現內部程序通訊

2021-04-20 17:40:59 字數 2727 閱讀 9278

引言

內部程序間通訊和資料交換有訊息、共享

記憶體、匿名(命名)管道、郵槽、windows套接字等多種技術。其中利用訊息機制實現ipc雖然同其他方法相比有交換的資料量小、攜帶的資訊少等缺點,但由於其實現方便、應用靈活而廣泛應用於無須大量、頻繁資料交換的內部程序通訊系統之中,尤其是對於在上層主控

軟體與底層工作軟體之間的命令與響應上更能充分顯示其良好的效能。本文就通過編制乙個主控軟體和乙個受其操作的底層工作軟體來闡述如何用vc++6.0通過訊息來實現內部程序

通訊。

windows訊息機制

windows是一種物件導向的體系結構,windows環境和應用程式都是通過訊息來互動的。windows應用程式開始執行後,windows為該程式建立乙個「訊息佇列(message queue)」,用以存放郵寄給該程式可能建立的各種不同視窗的訊息。訊息佇列中訊息的結構(msg)為:

typedef struct tagmsgmsg;

其中第乙個成員變數是用以標識接收訊息的視窗的視窗控制代碼;第二個引數便是訊息標識號,如wm_paint;第三個和第四個引數的具體意義同message值有關,均為訊息引數。前四個引數是非常重要和經常用到的,至於後兩個引數則分別表示郵寄訊息的時間和游標位置(螢幕座標)。

把訊息傳送到應用程式有兩種方法:一種是由系統將訊息「郵寄(post)」到應用程式的「訊息佇列」這是「進隊訊息」win32 api有對應的函式:postmessage(),此函式不等待該訊息處理完就返回;而另一種則是由系統在直接呼叫視窗函式時將訊息「傳送(send)」給應用程式的視窗函式,屬於「不進隊訊息」對應的函式是sendmessage()其必須等待該訊息處理完後方可返回。訊息是在訊息迴圈中被處理的,下面這段**就是乙個典型的訊息迴圈:

msg msg; //定義訊息名

while (getmessage (&msg, null, 0, 0))

return msg.wparam ;

訊息迴圈以getmessage呼叫開始,它從訊息佇列中取出乙個訊息。該函式的四個引數可以有控制地獲取訊息,第乙個引數指定要接收訊息的msg結構的位址,第二個引數表示視窗控制代碼,一般將其設定為空,表示要獲取該應用程式建立的所有視窗的訊息;第

三、四引數用於指定訊息範圍。後面三個引數被設定為預設值,用於接收傳送到屬於這個應用程式的任何乙個視窗的所有訊息。在接收到除wm_quit之外的任何乙個訊息後,getmessage()返回true;如果getmessage收到乙個wm_quit訊息,則返回false以退出訊息迴圈,終止程式執行。因此,在接收到wm_quit之前,帶有getmessage()的訊息迴圈可以一直迴圈下去。

當除wm_quit的訊息用getmessage讀入後,首先要經過函式translatemessage()對其進行解釋,但對大多數訊息來說並不起什麼作用。這裡起關鍵作用的是dispatchmessage()函式,把由getmessage獲取的windows訊息傳送給在msg結構中為視窗所指定的視窗過程。在訊息處理函式處理完訊息之後,**又迴圈到開始去接收另乙個訊息,這樣就完成了乙個完整的訊息迴圈。

主控程式的實現

首先建立乙個單文件工程,新增三個選單「命令一」、「命令二」、「命令三」及與之對應的命令響應函式:

onsendcomm1()

onsendcomm2()

onsendcomm3()

這裡,wm_comm是自定義訊息,用於在主控程式和底層通訊程式之間進行聯絡,為了能夠使用該訊息,必須首先新增預定義語句:

#define wm_comm wm_user + 100

上述幾個函式的結構沒有什麼區別,首先通過findwindow()返回由str變數指定視窗標題的應用程式主視窗控制代碼並將其儲存到pwnd。然後再通過該控制代碼呼叫sendmessage()函式並傳送剛才定義的wm_comm訊息及其訊息引數。如果函式被正確執行,底層程式將收到來發自主控程式的wm_comm訊息並可在訊息響應函式中完成對訊息引數的判斷處理以及進一步的操作。

底層工作程式的實現

最後,來介紹一下底層工作程式的實現過程。底層工作程式也是乙個單文件應用程式(當然,對於多文件應用程式也是一樣)。由於主控程式是通過對應用程式主視窗標題的捕獲來得到底層程式主視窗控制代碼的。因此需要在底層工作程式應用類的初始化應用函式initinstance()中新增(在函式末尾新增)下面語句:

m_pmainwnd->setwindowtext("receiver");

以設定底層工作程式的視窗標題。同時還要在主框架類的標頭檔案mainfrm.h中新增與主控程式一樣的自定義訊息定義:

#define wm_comm wm_user+100

由於底層程式需要接收並響應主控程式發出的通知訊息,因此還要在底層工作程式中新增對自定義訊息wm_comm的響應處理:

此後就可以通過辨別訊息的兩個訊息引數來區分主控程式傳送的是哪乙個命令從而可以執行相應的操作。執行主控程式和底層工作程式由於本程式採用的是sendmessage()所以當主控程式傳送訊息給底層工作程式時,底層工作程式彈出響應的模式對話方塊,在沒有關閉對話方塊前此訊息未處理完,sendmessage()也就沒有執行完,所以主控程式呈阻塞狀態,如改用posemessage()則不會發生阻塞,具體選用哪個函式還應根據實際要求靈活掌握。

結論:

通過上面的例項可以看出利用訊息進行程序間通訊不失為一種便捷的方法,程序間的資料交換量不大卻能完成相當的功能,上下層次有著明顯的介面,上層和底層只通過這個介面進行通訊,因此只要對上下層程式制定好規範詳盡的協議便可編制出協調性很好的軟體控制系統。

在VC 6 0下利用訊息實現內部程序通訊

內部程序間通訊和資料交換有多種方式 訊息 共享記憶體 匿名 命名 管道 郵槽 windows套接字等多種技術。其中利用訊息機制實現ipc雖然同其他方法相比有交換的資料量小 攜帶的資訊少等缺點,但由於其實現方便 應用靈活而廣泛應用於無須大量 頻繁資料交換的內部程序通訊系統之中,尤其是對於在上層主控軟體...

win socket程式設計下連線錯誤 VC6 0

在vc6.0下寫了乙個簡單的基於tcp的socket程式,但是在連線時出現如下錯誤 configuration tcpsrv win32 debug linking.main.obj error lnk2001 unresolved external symbol imp closesocket 4...

VC6 0下實現遮蔽鍵盤按鍵

最近在搞鍵盤訊息的東西,看了一篇文章,覺得不錯,拿來跟大家一塊分享下 1 問題的引入 隨著計算機的廣泛應用,計算機軟體得到了長遠發展。在軟體開發過程中,希望產品獨佔系統資源,或者希望規範用 戶行為,例如不希望使用者通過alt tab 組合鍵切換到其他應用程式或者通過win 鍵彈出開始選單。遊戲娛樂也...