正文

第二十课:勾子及数据库访问2007-09-26 19:05:00

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

分享到:

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

阅读(9520) | 评论(1)


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

评论

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