第二十課
Hook編程。如何安裝鉤子過程,如何編寫全局鉤子,動態連接庫裏的全局變量數據共享問題分析。ADO數據庫編程。在VB中利用ADO控件和ADO對象訪問數據庫,在VC中利用ADO技術訪問數據庫。
數據庫訪問技術
ODBC(Open Database Connectivity),開放數據庫互連。ODBC是上個世紀八十年代末九十年代初出現的技術,它爲編寫關係數據庫的客戶軟件提供了一種統一的接口。ODBC提供一個單一的API,可用於處理不同數據庫的客戶應用程序。使用ODBC API的應用程序可以與任何具有ODBC驅動程序的關係數據庫進行通信。
DAO(Data Access Object),數據訪問對象。DAO就是一組Microsoft Access/Jet數據庫引擎的COM自動化接口。 DAO不像ODBC那樣是面向C/C++程序員的,它是微軟提供給Visual Basic開發人員的一種簡單的數據訪問方法,用於操縱Access數據庫。
RDO(Remote Data Object),遠程數據對象。由於RDO直接調用ODBC API(而不是像DAO那樣通過Jet引擎),所以,可以爲使用關係數據庫的應用程序提供更好的性能。
OLE DB,對象鏈接與嵌入數據庫。 OLE DB在兩個方面對ODBC進行了擴展。首先, OLE DB提供了一個數據庫編程的COM接口;第二, OLE DB提供了一個可用於關係型和非關係型數據源的接口。 OLE DB的兩個基本結構是OLE DB提供程序(Provider)和OLE DB用戶程序(Consumer)。
ADO(ActiveX Data Object),ActiveX數據對象,它建立在OLE DB之上。ADO是一個OLE DB用戶程序。使用ADO的應用程序都要間接地使用OLE DB。ADO簡化了OLE DB,提供了對自動化的支持,使得像VBScript這樣的腳本語言也能夠使用ADO訪問數據庫。
ADO的三個核心對象
Connection對象
Connection對象表示了到數據庫的連接,它管理應用程序和數據庫之間的通信。 Recordset和Command對象都有一個ActiveConnection屬性,該屬性用來引用Connection對象。
Command對象
Command對象被用來處理重複執行的查詢,或處理需要檢查在存儲過程調用中的輸出或返回參數的值的查詢。
Recordset對象
Recordset對象被用來獲取數據。 Recordset對象存放查詢的結果,這些結果由數據的行(稱爲記錄)和列(稱爲字段)組成。每一列都存放在Recordset的Fields集合中的一個Field對象中。
- 安裝一個內部的hook
- {
- //添加一個一個蔽鼠標過程的hook:
- // 安裝一個鼠標hook,GetCurrentThreadId()返回調用線程的線程標識
- g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
- // 安裝一個鍵盤hook
- g_hKeyBoard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
- };
- LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam)
- {
- return 1;返回非零值,表示已經處理了這個消息,屏蔽了這個消息
- }
- LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam)
- {
- /*--------------------------------------*
- if(VK_SPACE==wParam) //VK_SPACE爲設備虛擬碼,表示空格
- //我們可以選擇go to definition找到其他虛擬碼,如果我們
- //同時屏蔽掉回車鍵,這時按鍵盤上的Alt+F4鍵可以退出。
- //如果你連Alt+F4都想屏蔽,添加以下判斷語句
- //if(VK_F4==wParam && (lParam>>29 & 1))
- //lParam右移29位,正好它的第二十九位在第一位上,
- //lParam得第二十九位表示了Alt鍵被按下
- return 1;
- /*--------------使程序在F2鍵按下後退出-------------------*/
- if(VK_F2==wParam)
- {
- ::SendMessage(g_hWnd,WM_CLOSE,0,0); //發送關閉消息
- UnhookWindowsHookEx(g_hKeyBoard);
- UnhookWindowsHookEx(g_hMouse);//移除一個已經安裝的hook
- //當我們自己發送消息關閉程序時,一定要記得關閉Hook
- }
- else
- return CallNextHookEx(g_hKeyBoard,nCode,wParam,lParam);
- //返回下一個hook
- }
- 安裝所有hook必須在動態鏈接庫裏去實現
- LIBARY Hook
- EXPORTS
- SetHook @2 //自己制定導出函數的序號
- SEGMENTS
- MySec READ WRITE SHARE
- #include <windows.h>
- HHOOK g_hMouse = NULL; //保存鉤子句柄
- HHOOK g_hKeyboard = NULL;
- #pragma data_seg("MySec")//MySec是新創建的節的名字(不能超過8個字節)
- HWND g_hWnd=NULL; //新變量必須初始化,否則沒有新建節的信息
- #pragma data_seg() //以上爲新建節
- #pragma comment(linker,"/section:MySec,RWS") //設置節的屬性,讀,寫,共享
- //HWND g_hWnd;
- /*---------得到動態鏈接庫模擬句柄的方法1---------*
- HINSTANCE g_hInst;
- BOOL WINAPI DllMain(
- HINSTANCE hinstDLL,
- DWORD fdwReason,
- LPVOID lpvReserved
- )
- {
- g_hInst=hinstDLL;
- }
- /*------------------------------------------------*/
- LRESULT CALLBACK MouseProc(int nCode,
- WPARAM wParam,LPARAM lParam)
- {
- return 1;
- }
- LRESULT CALLBACK KeyboardProc(int nCode,
- WPARAM wParam,LPARAM lParam)
- {
- if(VK_F2 == wParam)
- {
- SendMessage(g_hWnd,WM_CLOSE,0,0);
- UnhookWindowsHookEx(g_hMouse);
- UnhookWindowsHookEx(g_hKeyboard);
- }
- return 1;
- }
- void SetHook(HWND hwnd)
- {
- g_hWnd = hwnd;
- g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc,
- GetModuleHandle("Hook")/*動態鏈接庫模塊句柄*/,0);
- g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,
- GetModuleHandle("Hook")/*動態鏈接庫模塊句柄*/,0);
- }
SetWindowPos
函數功能:該函數改變一個子窗口,彈出式窗口式頂層窗口的尺寸,位置和Z序。子窗口,彈出式窗口,及頂層窗口根據它們在屏幕上出現的順序排序、頂層窗口設置的級別最高,並且被設置爲Z序的第一個窗口。 函數原型:BOOL SetWindowPos(HWND hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,
int cy,UNIT.Flags);
導入數據庫
在#include "stdafx.h"
#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
//避免數據庫的結尾和文件結尾衝突
- 數據庫的連接
- void CAdoDlg::OnBtnQuery()
- {
- // TODO: Add your control notification handler code here
- CoInitialize(NULL); //初始化com庫
- _ConnectionPtr pConn(__uuidof(Connection));
- /智能指針,uudiof獲取全局唯一標識符
- _RecordsetPtr pRst(__uuidof(Recordset));
- _CommandPtr pCmd(__uuidof(Command));
- pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";
- pConn->Open("","","",adConnectUnspecified);
- //pRst=pConn->Execute("select * from authors",NULL,adCmdText);
- //pRst->Open("select * from authors",_variant_t((IDispatch*)pConn),
- // adOpenDynamic,adLockOptimistic,adCmdText);
- pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
- pCmd->CommandText="select * from authors";
- pRst=pCmd->Execute(NULL,NULL,adCmdText);
- while(!pRst->rsEOF)
- {
- ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
- (_bstr_t)pRst->GetCollect("au_lname"));
- pRst->MoveNext();
- }
- pRst->Close();
- pConn->Close();
- pCmd.Release();
- pRst.Release();
- pConn.Release();
- CoUninitialize(); //釋放com庫
- }