一、HOOK
1、局部鈎子

OS感覺滑鼠或鍵盤事件,産生相應的消息,把此消息放到應用程式的消息隊列中,應用程式通過調用GetMessage函數取出消息,然後調用DispatchMessage函數将這條消息排程給OS,OS會調用在設計視窗類時指定的應用程式視窗過程對這一消息進行處理。
可以通過SetWindowsHookEx來安裝一個HOOK鈎子過程;類似于必經道路上的路卡或查哨的;Before terminating, an application must call the UnhookWindowsHookEx function to free system resources associated with the hook.
最後安裝的鈎子總是排在鈎子鍊的前面。通過CallNextHookEx passes the
hook information to the next hook procedure in the current hook chain. A hook
procedure can call this function either before or after processing the hook information.
虛拟鍵盤的宏都是以“VK_”開頭的。
示例代碼
代碼
//2
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;
}
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
if(VK_F2==wParam)
SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hMouse);
UnhookWindowsHookEx(g_hKeyboard);
//1
{
int cxScreen,cyScreen;
cxScreen=GetSystemMetrics(SM_CXSCREEN);
cyScreen=GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);
SetHook(m_hWnd);
}
2、全局鈎子
如果想讓所有程序都可以調用鈎子程式,則必須把安裝鈎子的代碼放到動态庫中去。The global hooks are a shared resource, and installing one affects all applications
in the same desktop as the calling thread. All global hook functions must be in
libraries. Global hooks should be restricted to special-purpose applications or to use as a
development aid during application debugging. Libraries that no longer need a hook
should remove its hook procedure.
3、涉及的API
1)GetModuleHandle
The GetModuleHandle function retrieves a module handle for the specified module if the
file has been mapped into the address space of the calling process.
2)SetWindowsHookEx
Installs an application-defined hook procedure into a hook chain。
有兩種方法得到該函數的第三個參數:
法一:儲存DllMain函數傳進來的DLL句柄。
法二:通過GetModuleHandle函數。
3)CWnd::SetWindowPos
to change the size, position, and Z-order of child, pop-up, and top-level windows.
4)GetSystemMetrics
Retrieves the specified system metric or system configuration setting.
http://msdn.microsoft.com/en-us/library/ms724385%28VS.85%29.aspx
4、寫入時複制機制
為了解決多個程序通路同一份DLL中全局共享變量,而帶來程式不确定問題,引入寫入時複制機制。
圖示 P749 寫入時複制機制
一個程序想修改DLL資料頁面(2)上的資料(該資料可以被多個程序共享)時,OS會配置設定一個新的頁面,并将資料頁面(2)上的資料複制一份到這個新頁面中,然後斷開資料頁(2)到這個程序資料空間的映射,将新的頁面映射到該程序的位址空間。
5、建立共享節
由上節可見,由于寫入時複制機制,如果多個程序真的想共享一個變量的話,倒成了一個問題。
有兩種方法來建立一個真正意義的全局共享變量。
法一:建立共享節
Dumpbin [Headers] 檢視各節的資訊清單
法二:在def子產品中定義
6、擷取密碼
安裝消息鈎子WH_GETMESSAGE,得到WM_GETTEXT消息的相關資訊,從該消息的附加參數中就可以得到文本框内的密碼資訊。
二、資料庫
1、關于資料庫的幾個新名詞
1)ODBC
2)OLE DB
OLE DB,對象連結與嵌入資料庫。 OLE DB在兩個方面對ODBC進行了擴充。首先, OLE DB提供了一個資料庫程式設計的COM接口;第二, OLE DB提供了一個可用于關系型和非關系型資料源的接口。 OLE DB的兩個基本結構是OLE DB提供程式(Provider)和OLE DB使用者程式(Consumer)。
OLE(Object Linking and Embedding) DB中的對象主要包括資料源對象、階段對象、指令對象和行組對象。使用OLE DB的應用程式會用到如下的請求序列:初始化OLE連接配接到資料源、發出指令、處理結果、釋放資料源對象。
3)ADO
ADO (ActiveX Data Objects,ActiveX資料對象)建立在OLE DB 之上,ADO是一個OLE DB使用者程式,即他本身是一個Consumer,也是一個COM元件。ADO簡化了OLE DB,提供了對自動化的支援,使得像VBScript這樣的腳本語言也能夠使用ADO通路資料庫。
如何采用ADO技術通路資料庫的話,實際調用過程是:ADO客戶程式通過ADO再通路OLE DB提供程式,這樣通路速度就要慢一些。
ADO中有三個核心對象:
(1) Connection對象 表示到資料庫的連接配接,它管理應用程式和資料庫之間的通信。
(2) Command對象 用來處理重複執行的查詢,或處理需要檢查在儲存過程調用中的輸出或傳回參數的值的查詢。有一個ActiveConnection屬性,該屬性用來引用Connection對象。
(3) Recordset對象 用來擷取資料,存放查詢的結果,這些結果由資料的行(記錄)和列(字段)組成。每一列都存放在Recordset的Fields集合中的一個Field對象中。有一個ActiveConnection屬性,該屬性用來引用Connection對象。
在利用ADO通路資料庫時,VB比VC更容易使用。