正文

第二十课:勾子及数据库访问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_CONVERSIONW2A宏,还需要在相应的.CPP文件中包括如下的头文件

  #include”atlbase.h”

阅读(4901) | 评论(1)


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

评论

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