VC++(二十)HOOK和数据库访问

HOOK编程

当在应用程序窗口中按下鼠标左键时,操作系统会感知到这一事件,然后产生鼠标左键按键消息,接着把此消息放到应用程序的消息队列中,应用程序通过GetMessage函数取出消息,然后调用Dispatch Message函数将这条消息调度给操作系统。操作系统会调用在设计窗口类时指定的应用程序窗口过程对这一消息进行处理。

初衷:不想对一些消息进行响应。比如说安装过程中希望安装程序不能响应用户的鼠标和键盘消息,以免影响软件的安装过程。那么需要截获这两类消息。然后让他们不再继续往下传递。

操作系统将我们感兴趣的消息都先交给钩子过程,后者实际上是一个函数,在此函数中进行判断,如果是我们希望屏蔽掉的消息,那么就直接处理掉,不让他再继续向下传递。

HOOK过程,称为钩子过程。SetWindowsHookEx安装一个钩子过程。
最后安装的钩子过程总是排列在该链的前面。

进程内钩子
全局钩子

动态库的导入库和静态库的区别

导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
以lib后缀的库有两种,一种为静态链接库,另一种称为动态链接库的导入库。

静态库是一个或多个obj文件的打包,所以有人干脆把从obj文件生成lib的过程称为archive,即合并到一起。比如你链接一个静态库,如果其中有错,他会准确地找到是哪个obj有错,即静态lib只是壳子。

动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则就需要自己loadlibrary调入dll文件,然后再手工getprocadress获得对应函数了。有了导入库后,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。

导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
这也是实际上很多开源代码发布的惯用方式:

  1. 预编译的开发包:包含一些.dll文件和一些.lib文件。其中这里的.lib就是导入库,而不要错以为是静态库。但是引入方式和静态库一样,要在链接路径上添加找到这些.lib的路径。而.dll则最好放到最后产生的应用程序exe执行文件相同的目录。这样运行时,就会自动调入动态链接库。
  2. 用户自己编译: 下载的是源代码,按照readme自己编译。生成很可能也是.dll + .lib(导入库)的库文件
  3. 如果你只有dll,并且你知道dll中函数的函数原型,那么你可以直接在自己程序中使用LoadLibary调入DLL文件,然后使用GetProcAddress调用DLL中的函数。
    当DLL被链接时,链接程序要查找关于输出变量,函数,或C++类的信息,并自动生成一个lib文件。该lib文件包含一个DLL输出的符号列表。如果要链接引用该DLL的输出符号的任何可执行模块,该lib文件是必不可少的(使用GetProcAddress除外)。
    其实导入库中并不含RVA(每个符号的相对虚拟地址),只是一些符号而已,还有关于这个lib所对应的DLL的名字等。 (这只是我现在的理解)
    那当应用程序调用一个DLL的函数时,是怎么进行的呢?(使用lib的情况下)
    答案是在进程的主线程开始运行之前,由加载器完成。
    加载器根据输入节中DLL的名字按照windows的搜索路径搜索DLL,找到后DLL映射到进程的地址空间,这是DLL中对应于输入节中的各个符号的地址就可以确定了,加载器在这个时候将地址重新填入可执行模块的输入节中,动态连接完成。

写入时复制机制 Windows 2000 Windows 98的区别

Windows 2000采用的写入时复制机制。在改变数据之前,两个进程仍然是共享同一份数据。并且对一个只读数据来说,也是在多个进程间共享的。
但是
Windows 98采用的不是这种机制。在Windows 98下,对于可写入的数据,每个进程都拥有一个可写入数据的复制。

如果希望 HOOKTest 程序运行时,即使切换到其他进程的情况下。按F2也能使 HOOKTest 程序退出。
可以为HOOK.dll创建一个新的节,并将此节设置为一个共享的节,然后将g_hWnd放到此节中,让该全局变量在多个进程中共享。

数据库访问技术

ODBC(open database connectivity,开放数据库互联)

  • 计算机COM接口:
    COM口即串行通讯端口。微机上的com口通常是9针,也有25针的接口,最大速率115200bps。通常用于连接鼠标(串口)及通讯设备(如连接外置式MODEM进行数据通讯或一些工厂的CNC机接口)等。一般主板外部只有一个COM口,机箱后面和并口一起的那个九孔输出端(梯形),就是COM1口,COM2口一般要从主板上插针引出。并口是最长的那个梯形口。
    但目前主流的主板一般都只带1个串口,甚至不带,慢慢会被USB 取代。
    COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口。

  • 并行口:
    并行口是电脑与其它设备传送信息的一种标准接口,这种接口将8位数据位同时并行传送,并行口数据传送速度较串行口快,但传送距离较短。

  • 并口、串口、COM口区别
    并行接口,简称并口。并口采用的是25针D形接头。所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错,目前,并行接口主要作为打印机端口等。

1.串口叫做串行接口,也称串行通信接口,即COM口。USB是近几年发展起来的新型接口标准,主要应用于高速数据传输领域。
现在的电脑一般有两个串行口:COM1和COM2。
Universal Serial Bus(通用串行总线)简称USB,是目前电脑上应用较广泛的接口规范,由Intel、Microsoft、Compaq、IBM、NEC、Northern Telcom等几家大厂商发起的新型外设接口标准。USB接口是电脑主板上的一种四针接口,其中中间两个针传输数据,两边两个针给外设供电。USB接口速度快、连接简单、不需要外接电源,传输速度12Mbps,最新USB2.0可达480Mbps;电缆最大长度5米,USB电缆有4条线,2条信号线,2条电源线,可提供5伏特电源,USB电缆还分屏蔽和非屏蔽两种,屏蔽电缆传输速度可达12Mbps,价格较贵,非屏蔽电缆速度为1.5Mbps,但价格便宜;USB通过串联方式最多可串接127个设备;支持热插拔。

2.串口与并口的区别:
串口形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。
但是并不是并口快,由于8位通道之间的互相干扰。传输时速度就受到了限制。而且当传输出错时,要同时重新传8个位的数据。串口没有干扰,传输出错后重发一位就可以了。所以要比并口快。串口硬盘就是这样被人们重视的。

你可能感兴趣的:(VC++(二十)HOOK和数据库访问)