第二十课:勾子及数据库访问 本讲主要内容: 第一部分:勾子 1、 回忆第一讲内容:(操作系统与应用程序的关系)由如果想从中间控制应用程序的消息,应该从哪入手?(如果把以高速公路上的汽车比作消息,以检查流串犯为例引出需要在检查站处设岗)从而引入勾子的概念,从而讲到勾子链(后挂的排在勾子链上的前面) 2、 函数的讲解(SetWindowsHookEx()与UnHookWindowHookEx())设一个勾子也只是调用一个API函数SetWindowsHookEx()函数,要想取消勾子的作用就要卸掉勾子,可以使用如下API函数UnhookWindowsHookEx()函数。(例子:在一个exe文件中实现一个简单的勾子,以处理回车键为例(VK_RETURN)) 2、在一个DLL文件中实现同上的一个简单的勾子(void setHook()、void UnHook()、setWindowsHookEx(WH_KEYBOARD,::GetModuleHandle(“HookDll”),GetCurrentThreadID())) 3、在一个DLL文件中实现一个系统级别的勾子(将线程号改为0)(此时可以用窃取别人密码为例子来讲) 3、 在一个EXE文件中实现一个自动启动全屏的应用程序并带一个DLL勾子 a、新建一个基于对话框的工程,去掉对话框类及相应的文件 b、从CWnd继承一个新类,实现其WM_PAINT消息响应函数 c、在InitInstance()中加入如下代码创建主窗口 CString ClassName=::AfxRegisterWndClass(0,0,(HBRUSH)::GetStockObject( WHITE_BRUSH),0); m_FullWnd.Create(ClassName,"",WS_CHILD,CRect(0,0,0,0),CWnd::GetDesktopWindow(),1); m_FullWnd.SetWindowPos(&CWnd::wndTopMost,0,0,::GetSystemMetrics(SM_CXSCREEN),::GetSystemMetrics(SM_CYSCREEN),SWP_SHOWWINDOW); m_FullWnd.ShowWindow(SW_SHOWNORMAL); m_pMainWnd=&m_FullWnd; setHook(m_FullWnd.GetSafeHwnd()); return true; d、在HookDLL中增加如下说明语句: LIBRARY HOOKDLL SEGMENTS .It315 READ WRITE SHARED EXPORTS setHook unhook .CPP文件中实现如下: #pragma data_seg(".It315") HWND hWnd=NULL; #pragma data_seg() 消息处理代码的编写 LRESULT CALLBACK xx(int code, WPARAM wParam, LPARAM lParam) { if(wParam==VK_NUMPAD6) { ::PostMessage(hWnd,WM_CLOSE,0,0); unHook(); return 1; } return CallNextHookEx(hHook,code,wParam,lParam); } 第二部分:ADO数据库编程 1、介绍ADO中的三大对象及其关系 2、给出一个实例 4、 各种不同的实现办法举例 在stdafx.h文件中加入如下代码,导入ADO中的对象及其相应的常量 #import “c:\program files\common files\system\ado\msado15.dll” no_namespace rename(“EOF”,”adoEOF”) void CAdoTestDlg::OnButton1() { USES_CONVERSION; ::CoInitialize(NULL); _ConnectionPtr con(__uuidof(Connection)); _RecordsetPtr rst(__uuidof(Recordset)); _CommandPtr cmd(__uuidof(Command)); con->Open(_bstr_t("Provider=SQLOLEDB;server=yly;database=Northwind;"),_bstr_t("sa"),_bstr_t(""),-1); cmd->put_ActiveConnection(_variant_t((IDispatch*)con)); cmd->put_CommandText(_bstr_t("select * from Customers")); cmd->put_CommandType(adCmdText); rst=cmd->Execute(NULL,NULL,-1); //rst->Open(_variant_t("select * from Customers"),_variant_t((IDispatch*) con),adOpenDynamic,adLockOptimistic,-1); //rst=con->Execute(_bstr_t("select * from Customers"),NULL,-1); while(!rst->adoEOF) { m_List.AddString(W2A(rst->GetCollect(_variant_t("city")).bstrVal)); rst->MoveNext(); } } 注意:由于在代码中采用了USES_CONVERSION、W2A宏,还需要在相应的.CPP文件中包括如下的头文件 #include”atlbase.h”

评论