漫談編程基礎

1.真正的文件

      文件被存放在硬盤上(作爲二進制),它有一套地址(可以用一個十六進制工具直接打開,並針對某個內容-這個內容必定有一個外存地址,進行編輯並保存,注意不能用記事本之類的,因爲計算機只能以ASCII格式保存,會破壞原文件的地址),文件被加載入內存之後(map),又有一套內存中的地址,,一些靜態分析工具就會求出這個地址對應它在硬盤上的地址(偏移地址加鏡像基)

 

2.真正的數據

    從很大意義上來說,計算機是一種模擬現實的工具,計算機對現實中的數據(字符,音頻,視頻)的模擬實現手段是"編碼",如音頻,視頻就是編碼實現的,字符包括字母和符號,也是用ASCII碼來表示的,用0和1的不同組合來表示的ASCII碼是一種低層的二進制級的編碼,音頻,視頻較之可能是高一級的編碼方式,但是數據不只有字符數據,還有數組數值,它們稱爲"普通數據",現實中的數值在數學(專門研究"數"的科學)中分類爲:(2.bmp) 

或者有理數分爲整數和分數,其實給實數和有理數分類的方法有多種,關鍵看什麼標準,由上可以看出,實數是用小數來描述的,也就是說,可以把所有的實數理解看作爲小數,換句話來說,數的本質是小數,數的小數形式可以描述和表示一切可能存在的實數數值,換言之,小數與實數等價,在數值上有一一對應的關係,因此用計算機來表示數值數據只要表示了小數就成功地表示了一切數學中可能出現的實數(實際上這也是由計算機內部結構決定的,因爲CPU內置浮點器),也就表示了現實生活中一切可能用到的實數,因此在計算機也稱實型

3.真正的Windows消息

      消息機制和繪圖機制是微軟Windows及其周邊其它產品與生俱來的,是Win 系列OS作爲一個操作系統進行微機內部實現的二大支柱和特徵,消息系統是Windows下一切應用程序間,包括Windows自身,進行交互和通訊的渠道,是Windows實現對運行在其下的所有應用程序進行控制及應用程序對Windows進行響應的解決手段,因此對Windows的編程,無論是在哪種 語言規範和IDE 下,都不可避免地要涉及到消息處理,雖然有些編程語言如 VB 用事件驅動編程機制在很大程度上封裝了消息的複雜性,但若要深入Win32編程,就必須學習Windows的消息系統,正如遊戲編程要掌握Win的繪圖機制一樣,而只要你一旦深韻了這二大支柱和基本,你就掌握了Win32編程的根本。。

       消息的產生來源於系統事情(包括計時器事件)和用戶事情,Windows用消息來調入和關閉(還有其它處理,如繪製一個窗口等)應用程序,一個典型表現是在關機操作中,Windows發一個關機的消息給所有正在運行的應用程序,告知它們退出內存,此時,應用程序用迴應消息的方法來響應OS,因此,消息是應用程序與WinOS交互的手段..

      消息的主體是應用程序之間和應用程序與 OS 之間,(這是通俗的說法,其實在一個應用程序的內部,各“窗口”組件之間也存在着消息的流動,窗口組件與它們的父窗口和上層窗口之間當然也有消息的傳遞過程("命令傳遞",後面在跟蹤一個消息的路徑中將會詳談)Windows內部即時流動的消息數量是如此的寵大,程序實現之外的手工分析是一種很自不量力的事情)消息的最終主體卻是窗口與窗口之間,窗口與OS之間 - 因爲在MFC的技術規範裏,只有窗口進程才能發送和接收一個消息並處理它,當然一些非界面窗口類如文檔類也能處理一個消息,消息的最終歸宿是某個窗口類的成員函數,也就是進入消息處理函數被處理,或被某個非界面類也就是內部處理類如文檔類處理,系統中默認的窗口類和用戶註冊的窗口類都有進程,都能在內存中創建實在的窗口對象,窗口對象和窗口類接收和處理(千萬注意:接收一個消息和處理一個消息是相差甚大的二個過程,後面將在討論重定向一個消息技術時將談到)發往它或由它主動發往別的窗口進程或OS的消息,修改窗口進程干涉窗口進程對消息的處理過程(而不是接收過程,這個區別的詳細解釋請參見後面從"注意消息泵並不是一個.."起的文字)是可能的(窗口進程只是一段函數),但是如果這個窗口進程屬於別人,如系統的窗口類,你將沒有源程序進行修改,但卻可以用消息重定的技術加以干涉,比如用戶自定義的窗口類,用戶完全可以自定義它的窗口進程,編寫自己的消息泵,實現對消息的重定向,編寫用戶自己的消息泵屬於Win32編程中重定向一個消息的七大技術之一。

      MFC中有七種技術可以用來重定向一個消息,它們是:1,子分類2,超分類3,OnCmdMsg(),4,SetCapture5,編寫自己的消息泵,6SetWindowsHookEx(),人們常說的鉤子函數,便是其中之一.

     在談完消息泵的概念後,我們將一步一步追蹤一個消息在系統中的路徑,然後才能討論對它的重定向。

     消息泵並不是一個窗口類的窗口進程,雖然它們都是函數,同樣都對注入到這個窗口進程的消息進行工作,而並不最終處理消息本身(上面已經說到原因),消息泵是一個通俗的說法,它只與消息被髮往窗口進程後的接收工作有關而不與處理過程有關(上面也已經說到消息的接收和處理是二不同過程),而窗口進程恰恰相反它只與處理有關不與接收有關下面開始詳述。。

   消息泵被包含在 CWinApp 的成員函數Run()..........寫得太累了,,,未完待續.

 

 

實際上在UML的規範裏,消息是一切對象發生聯繫形成系統的手段。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章