VC++(二十)HOOK和數據庫訪問

HOOK編程

當在應用程序窗口中按下鼠標左鍵時,操作系統會感知到這一事件,然后產生鼠標左鍵按鍵消息,接著把此消息放到應用程序的消息隊列中,應用程序通過GetMessage函數取出消息,然后調用Dispatch Message函數將這條消息調度給操作系統。操作系統會調用在設計窗口類時指定的應用程序窗口過程對這一消息進行處理。

初衷:不想對一些消息進行響應。比如說安裝過程中希望安裝程序不能響應用戶的鼠標和鍵盤消息,以免影響軟件的安裝過程。那么需要截獲這兩類消息。然后讓他們不再繼續(xù)往下傳遞。

操作系統將我們感興趣的消息都先交給鉤子過程,后者實際上是一個函數,在此函數中進行判斷,如果是我們希望屏蔽掉的消息,那么就直接處理掉,不讓他再繼續(xù)向下傳遞。

HOOK過程,稱為鉤子過程。SetWindowsHookEx安裝一個鉤子過程。
最后安裝的鉤子過程總是排列在該鏈的前面。

進程內鉤子
全局鉤子

動態(tài)庫的導入庫和靜態(tài)庫的區(qū)別

導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。
以lib后綴的庫有兩種,一種為靜態(tài)鏈接庫,另一種稱為動態(tài)鏈接庫的導入庫。

靜態(tài)庫是一個或多個obj文件的打包,所以有人干脆把從obj文件生成lib的過程稱為archive,即合并到一起。比如你鏈接一個靜態(tài)庫,如果其中有錯,他會準確地找到是哪個obj有錯,即靜態(tài)lib只是殼子。

動態(tài)庫一般會有對應的導入庫,方便程序靜態(tài)載入動態(tài)鏈接庫,否則就需要自己loadlibrary調入dll文件,然后再手工getprocadress獲得對應函數了。有了導入庫后,你只需要鏈接導入庫后按照頭文件函數接口的聲明調用函數就可以了。

導入庫和靜態(tài)庫的區(qū)別很大,他們實質是不一樣的東西。靜態(tài)庫本身就包含了實際執(zhí)行代碼、符號表等等,而對于導入庫而言,其實際的執(zhí)行代碼位于動態(tài)庫中,導入庫只包含了地址符號表等,確保程序找到對應函數的一些基本地址信息。
這也是實際上很多開源代碼發(fā)布的慣用方式:

  1. 預編譯的開發(fā)包:包含一些.dll文件和一些.lib文件。其中這里的.lib就是導入庫,而不要錯以為是靜態(tài)庫。但是引入方式和靜態(tài)庫一樣,要在鏈接路徑上添加找到這些.lib的路徑。而.dll則最好放到最后產生的應用程序exe執(zhí)行文件相同的目錄。這樣運行時,就會自動調入動態(tài)鏈接庫。
  2. 用戶自己編譯: 下載的是源代碼,按照readme自己編譯。生成很可能也是.dll + .lib(導入庫)的庫文件
  3. 如果你只有dll,并且你知道dll中函數的函數原型,那么你可以直接在自己程序中使用LoadLibary調入DLL文件,然后使用GetProcAddress調用DLL中的函數。
    當DLL被鏈接時,鏈接程序要查找關于輸出變量,函數,或C++類的信息,并自動生成一個lib文件。該lib文件包含一個DLL輸出的符號列表。如果要鏈接引用該DLL的輸出符號的任何可執(zhí)行模塊,該lib文件是必不可少的(使用GetProcAddress除外)。
    其實導入庫中并不含RVA(每個符號的相對虛擬地址),只是一些符號而已,還有關于這個lib所對應的DLL的名字等。 (這只是我現在的理解)
    那當應用程序調用一個DLL的函數時,是怎么進行的呢?(使用lib的情況下)
    答案是在進程的主線程開始運行之前,由加載器完成。
    加載器根據輸入節(jié)中DLL的名字按照windows的搜索路徑搜索DLL,找到后DLL映射到進程的地址空間,這是DLL中對應于輸入節(jié)中的各個符號的地址就可以確定了,加載器在這個時候將地址重新填入可執(zhí)行模塊的輸入節(jié)中,動態(tài)連接完成。

寫入時復制機制 Windows 2000 Windows 98的區(qū)別

Windows 2000采用的寫入時復制機制。在改變數據之前,兩個進程仍然是共享同一份數據。并且對一個只讀數據來說,也是在多個進程間共享的。
但是
Windows 98采用的不是這種機制。在Windows 98下,對于可寫入的數據,每個進程都擁有一個可寫入數據的復制。

如果希望 HOOKTest 程序運行時,即使切換到其他進程的情況下。按F2也能使 HOOKTest 程序退出。
可以為HOOK.dll創(chuàng)建一個新的節(jié),并將此節(jié)設置為一個共享的節(jié),然后將g_hWnd放到此節(jié)中,讓該全局變量在多個進程中共享。

數據庫訪問技術

ODBC(open database connectivity,開放數據庫互聯)

  • 計算機COM接口:
    COM口即串行通訊端口。微機上的com口通常是9針,也有25針的接口,最大速率115200bps。通常用于連接鼠標(串口)及通訊設備(如連接外置式MODEM進行數據通訊或一些工廠的CNC機接口)等。一般主板外部只有一個COM口,機箱后面和并口一起的那個九孔輸出端(梯形),就是COM1口,COM2口一般要從主板上插針引出。并口是最長的那個梯形口。
    但目前主流的主板一般都只帶1個串口,甚至不帶,慢慢會被USB 取代。
    COM口的接口標準規(guī)范和總線標準規(guī)范是RS-232,有時候也叫做RS-232口。

  • 并行口:
    并行口是電腦與其它設備傳送信息的一種標準接口,這種接口將8位數據位同時并行傳送,并行口數據傳送速度較串行口快,但傳送距離較短。

  • 并口、串口、COM口區(qū)別
    并行接口,簡稱并口。并口采用的是25針D形接頭。所謂“并行”,是指8位數據同時通過并行線進行傳送,這樣數據傳送速度大大提高,但并行傳送的線路長度受到限制,因為長度增加,干擾就會增加,數據也就容易出錯,目前,并行接口主要作為打印機端口等。

1.串口叫做串行接口,也稱串行通信接口,即COM口。USB是近幾年發(fā)展起來的新型接口標準,主要應用于高速數據傳輸領域。
現在的電腦一般有兩個串行口:COM1和COM2。
Universal Serial Bus(通用串行總線)簡稱USB,是目前電腦上應用較廣泛的接口規(guī)范,由Intel、Microsoft、Compaq、IBM、NEC、Northern Telcom等幾家大廠商發(fā)起的新型外設接口標準。USB接口是電腦主板上的一種四針接口,其中中間兩個針傳輸數據,兩邊兩個針給外設供電。USB接口速度快、連接簡單、不需要外接電源,傳輸速度12Mbps,最新USB2.0可達480Mbps;電纜最大長度5米,USB電纜有4條線,2條信號線,2條電源線,可提供5伏特電源,USB電纜還分屏蔽和非屏蔽兩種,屏蔽電纜傳輸速度可達12Mbps,價格較貴,非屏蔽電纜速度為1.5Mbps,但價格便宜;USB通過串聯方式最多可串接127個設備;支持熱插拔。

2.串口與并口的區(qū)別:
串口形容一下就是一條車道,而并口就是有8個車道同一時刻能傳送8位(一個字節(jié))數據。
但是并不是并口快,由于8位通道之間的互相干擾。傳輸時速度就受到了限制。而且當傳輸出錯時,要同時重新傳8個位的數據。串口沒有干擾,傳輸出錯后重發(fā)一位就可以了。所以要比并口快。串口硬盤就是這樣被人們重視的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容