正文

第20课 钩子与数据库编程2007-05-01 15:40:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/bclz/25447.html

分享到:

1.Hook简介:作用是拦截某些消息,关键函数是SetWindowsHookEX()2.示例程序:  1.新建一基于对话框工程,InnerHook,此过程的钩子是只拦截本进程的。  2.在OnInitDialog()中添加代码:   g_hWnd=m_hWnd;g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());设置了鼠标钩子g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());设置了键盘钩子  3.完成钩子函数的编写:HHOOK g_hKeyboard=NULL;HHOOK g_hMouse;HWND g_hWnd=NULL;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_SPACE==wParam || VK_RETURN==wParam)如果是空格键  /*if(VK_F4==wParam && (1==(lParam>>29 & 1)))拦截ALT+F4按键!   return 1;  else   return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/  if(VK_F2==wParam)按F2时程序可以退出,这是留的后门。否则程序无法关闭,只能用任务管理器来关闭它了。  {   ::SendMessage(g_hWnd,WM_CLOSE,0,0);   UnhookWindowsHookEx(g_hKeyboard);当程序退出时最好将钩子移除。   UnhookWindowsHookEx(g_hMouse);  }  return 1;}3.编写一个屏屏蔽所有进程和所有线程的钩子程序。此时这个钩子必须安装在DLL中,然后被某个程序调用才行。  1.新建一个DLL工程名为Hook  2.增加Hook.cpp  3.代码如下:#include <windows.h>包含头文件HHOOK g_hMouse=NULL;HHOOK g_hKeyboard=NULL;#pragma data_seg("MySec")新建了一个节,用于将下 面的这个变量设为全局共享。HWND g_hWnd=NULL;这个变量是全局共享的。#pragma data_seg()//#pragma comment(linker,"/section:MySec,RWS")/*HINSTANCE g_hInst;BOOL WINAPI DllMain(   HINSTANCE hinstDLL,  // handle to the DLL module   DWORD fdwReason,     // reason for calling function   LPVOID lpvReserved   // reserved){  g_hInst=hinstDLL;}*/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)如果是F2键,则退出。  {   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);} Hook.DEF的代码如下:LIBRARY HookEXPORTSSetHook  @2SEGMENTSMySec READ WRITE SHARED  也可以设置节的属性。    4.新建一个工程调用此钩子函数。工程名为HookTest,基于对话框的。在OnInitDialog()中调用SetHook(),要事先声明_declspec(dllimport) void SetHook(HWND hwnd);      然后在Project->Setting->Link->加入..\Hook\Debug\Hook.lib,并将Hook.Dll拷贝到当前目录。int cxScreen,cyScreen;cxScreen=GetSystemMetrics(SM_CXSCREEN);cyScreen=GetSystemMetrics(SM_CYSCREEN);SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);将窗口保持在最前面。SetHook(m_hWnd);    5.DLL的调试方法,设置断点,然后运行时断点时,step into即可。4.数据库编程  1.ODBC,ADO简介:ADO可以认为是建立在ODBC上的。   ADO的三个核心对象Connection对象   Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 Recordset和Command对象都有一个ActiveConnection属性,该属性用来引用Connection对象。Command对象   Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。Recordset对象   Recordset对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。每一列都存放在Recordset的Fields集合中的一个Field对象中。  2.演示在VB中使用ADO的方法,方法比较简单,使用方便。另外在VB中演示了Connection和Command和Recordset的方法,用这三种方法都可以执行SQL语句。  3.在VC中利用ADO访问数据库。    1.新建一个基于对话框的工程,名为ADO。    2.在对话框中放一ListBox和一个Button控件。    3.在使用时须导入MSADO15.dll,方法是在StdAfx.h中#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")    至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlh和MSADO15.tli加到工程中,其目的只是方便我们查看而已。并不是编译需要它。    ADO也是COM组件,须初始化COM库方法是CoInitialize(NULL);使用完后须CoUninitialize();    代码如下:    void CAdoDlg::OnBtnQuery() {// TOD Add your control notification handler code hereCoInitialize(NULL);初始化_ConnectionPtr pConn(__uuidof(Connection));产生connection智能指针_RecordsetPtr pRst(__uuidof(Recordset));产生recordset智能指针_CommandPtr pCmd(__uuidof(Command));产生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();}至此20课笔记全部记完,关于数据库的比较简单些。

阅读(2485) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册