孫鑫mfc學習筆記第二十課

第二十課

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 DBADO簡化了OLE DB,提供了對自動化的支持,使得像VBScript這樣的腳本語言也能夠使用ADO訪問數據庫。

ADO的三個核心對象

Connection對象

Connection對象表示了到數據庫的連接,它管理應用程序和數據庫之間的通信。 RecordsetCommand對象都有一個ActiveConnection屬性,該屬性用來引用Connection對象。

Command對象

Command對象被用來處理重複執行的查詢,或處理需要檢查在存儲過程調用中的輸出或返回參數的值的查詢。

Recordset對象

Recordset對象被用來獲取數據。 Recordset對象存放查詢的結果,這些結果由數據的行(稱爲記錄)和列(稱爲字段)組成。每一列都存放在RecordsetFields集合中的一個Field對象中。

  1. 安裝一個內部的hook 
  2.         //添加一個一個蔽鼠標過程的hook: 
  3.     //  安裝一個鼠標hook,GetCurrentThreadId()返回調用線程的線程標識 
  4.         g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId()); 
  5.     //  安裝一個鍵盤hook 
  6.         g_hKeyBoard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId()); 
  7. }; 
  8.  
  9.  
  10. LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam) 
  11.     return 1;返回非零值,表示已經處理了這個消息,屏蔽了這個消息 
  12.  
  13.  
  14.  
  15. LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam) 
  16.     /*--------------------------------------* 
  17.     if(VK_SPACE==wParam)  //VK_SPACE爲設備虛擬碼,表示空格 
  18.         //我們可以選擇go to definition找到其他虛擬碼,如果我們 
  19.         //同時屏蔽掉回車鍵,這時按鍵盤上的Alt+F4鍵可以退出。 
  20.         //如果你連Alt+F4都想屏蔽,添加以下判斷語句 
  21.         //if(VK_F4==wParam && (lParam>>29 & 1)) 
  22.         //lParam右移29位,正好它的第二十九位在第一位上, 
  23.         //lParam得第二十九位表示了Alt鍵被按下 
  24.         return 1; 
  25.     /*--------------使程序在F2鍵按下後退出-------------------*/ 
  26.     if(VK_F2==wParam) 
  27.     { 
  28.         ::SendMessage(g_hWnd,WM_CLOSE,0,0);  //發送關閉消息 
  29.         UnhookWindowsHookEx(g_hKeyBoard); 
  30.         UnhookWindowsHookEx(g_hMouse);//移除一個已經安裝的hook 
  31.         //當我們自己發送消息關閉程序時,一定要記得關閉Hook 
  32.     } 
  33.  
  34.     else  
  35.         return CallNextHookEx(g_hKeyBoard,nCode,wParam,lParam); 
  36.         //返回下一個hook 
  37.  
  38.  
  39.  
  40. 安裝所有hook必須在動態鏈接庫裏去實現 
  41.  
  42. LIBARY Hook  
  43. EXPORTS  
  44. SetHook  @2         //自己制定導出函數的序號 
  45. SEGMENTS 
  46. MySec READ WRITE SHARE 
  47.  
  48. #include <windows.h> 
  49.  
  50. HHOOK g_hMouse = NULL;             //保存鉤子句柄 
  51. HHOOK g_hKeyboard = NULL; 
  52.  
  53. #pragma data_seg("MySec")//MySec是新創建的節的名字(不能超過8個字節) 
  54. HWND g_hWnd=NULL;  //新變量必須初始化,否則沒有新建節的信息 
  55. #pragma  data_seg()   //以上爲新建節 
  56. #pragma comment(linker,"/section:MySec,RWS")  //設置節的屬性,讀,寫,共享 
  57.  
  58. //HWND g_hWnd; 
  59. /*---------得到動態鏈接庫模擬句柄的方法1---------* 
  60. HINSTANCE g_hInst; 
  61. BOOL WINAPI DllMain( 
  62.                     HINSTANCE hinstDLL, 
  63.                     DWORD fdwReason, 
  64.                     LPVOID lpvReserved 
  65.                     ) 
  66. { 
  67.     g_hInst=hinstDLL; 
  68. } 
  69. /*------------------------------------------------*/ 
  70.  
  71. LRESULT CALLBACK MouseProc(int nCode, 
  72.         WPARAM  wParam,LPARAM lParam) 
  73.     return 1; 
  74. LRESULT CALLBACK KeyboardProc(int nCode, 
  75.         WPARAM  wParam,LPARAM lParam) 
  76.     if(VK_F2 == wParam) 
  77.     { 
  78.         SendMessage(g_hWnd,WM_CLOSE,0,0); 
  79.         UnhookWindowsHookEx(g_hMouse); 
  80.         UnhookWindowsHookEx(g_hKeyboard); 
  81.     } 
  82.     return 1; 
  83.  
  84. void SetHook(HWND hwnd) 
  85.     g_hWnd = hwnd; 
  86.     g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc, 
  87.         GetModuleHandle("Hook")/*動態鏈接庫模塊句柄*/,0); 
  88.     g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc, 
  89.         GetModuleHandle("Hook")/*動態鏈接庫模塊句柄*/,0); 

 

SetWindowPos

函數功能:該函數改變一個子窗口,彈出式窗口式頂層窗口的尺寸,位置和Z序。子窗口,彈出式窗口,及頂層窗口根據它們在屏幕上出現的順序排序、頂層窗口設置的級別最高,並且被設置爲Z序的第一個窗口。   函數原型:BOOL SetWindowPosHWND hWndHWND hWndlnsertAfter,int Xint Y,int cx

int cy,UNITFlags);

 

 

導入數據庫

#include "stdafx.h"

#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")    

//避免數據庫的結尾和文件結尾衝突

  1. 數據庫的連接 
  2. void CAdoDlg::OnBtnQuery()  
  3.     // TODO: Add your control notification handler code here 
  4.     CoInitialize(NULL);         //初始化com庫 
  5.     _ConnectionPtr pConn(__uuidof(Connection));          
  6. /智能指針,uudiof獲取全局唯一標識符 
  7.     _RecordsetPtr pRst(__uuidof(Recordset)); 
  8.     _CommandPtr pCmd(__uuidof(Command)); 
  9.  
  10.     pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs"
  11.     pConn->Open("","","",adConnectUnspecified); 
  12.  
  13.     //pRst=pConn->Execute("select * from authors",NULL,adCmdText); 
  14.     //pRst->Open("select * from authors",_variant_t((IDispatch*)pConn), 
  15.     //  adOpenDynamic,adLockOptimistic,adCmdText); 
  16.     pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn)); 
  17.     pCmd->CommandText="select * from authors"
  18.     pRst=pCmd->Execute(NULL,NULL,adCmdText); 
  19.     while(!pRst->rsEOF) 
  20.     { 
  21.         ((CListBox*)GetDlgItem(IDC_LIST1))->AddString( 
  22.             (_bstr_t)pRst->GetCollect("au_lname")); 
  23.         pRst->MoveNext(); 
  24.     } 
  25.      
  26.     pRst->Close(); 
  27.     pConn->Close(); 
  28.     pCmd.Release(); 
  29.     pRst.Release(); 
  30.     pConn.Release(); 
  31.     CoUninitialize();       //釋放com庫 


 

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