第二十课
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库
- }
本文出自 “不曾远去” 博客,谢绝转载!