第二十课:勾子及数据库访问
本讲主要内容:
第一部分:勾子
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”
评论