第二十课

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库