目录:
1. 动态链接库DLL介绍
2.使用Regular DLL写钩子1. 动态链接库DLL介绍
微软的Visual C++支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。Non-MFC DLL指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。Regular DLL:和下述的Extension Dlls一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。常规DLL又可细分成静态链接到MFC和动态链接到MFC上的.
(一) Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库
每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { switch( ul_reason_for_call ) { case DLL_PROCESS_ATTACH: ....... case DLL_THREAD_ATTACH: ....... case DLL_THREAD_DETACH: ....... case DLL_PROCESS_DETACH: ....... } return TRUE; } |
参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 进程被停止、DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。
二)MFC AppWizard[dll]方式生成常规/扩展DLL
在MFC AppWizard[dll]下生成DLL文件又有三种方式,在创建DLL是,要根据实际情况选择创建DLL的方式。一种是常规DLL静态链接到MFC,另一种是常规DLL动态链接到MFC。两者的区别是:前者使用的是MFC的静态链接库,生成的DLL文件长度大,一般不使用这种方式,后者使用MFC的动态链接库,生成的DLL文件长度小;动态链接到MFC的规则DLL所有输出的函数应该以如下语句开始:
AFX_MANAGE_STATE(AfxGetStaticModuleState( )) //此语句用来正确地切换MFC模块状态
在MFC下建立DLL文件,会自动生成def文件框架,其它与建立传统的Non-MFC DLL没有什么区别,只要在相应的头文件写入关键字_declspec(dllexport)函数类型和函数名等,或在生成的def文件中EXPORTS下输入函数名就可以了。需要注意的是在向其它开发人员分发MFC扩展DLL 时,不要忘记提供描述DLL中类的头文件以及相应的.LIB文件和DLL本身,此后开发人员就能充分利用你开发的扩展DLL了。
2.使用Regular DLL写钩子使用Regular DLL写钩子的优点是可以很方便地使用MFC提供的类库,也很方便使用c++面向对象编程,同时写好的DLL也会很方便地被别的程序调用。有如此优点所以写钩子时首选常规动态库。
以全局的鼠标钩子为例说明使用常规动态写钩子的步骤:
(1)用VC创建一个基于常规动态库的空工程
MFC会自动根据工程名字生成一个派生自CWinApp的类,如工程名叫Mousehook,则
class CMousehookApp : public CWinApp
(2)添加成员函数
1
BOOL CMousehookApp::InitInstance()
2
{
3
AFX_MANAGE_STATE(AfxGetStaticModuleState());
4
hinsMouse=AfxGetInstanceHandle();
5
return TRUE;
6
}
7
8
int CMousehookApp::ExitInstance()
9
{
10
return TRUE;
11
}
(3)添加共享数据
1
#pragma data_seg(".SHARDAT")
2
static HHOOK mouse=NULL;
3
FILE *fm;
4
#pragma data_seg()
5
6
HINSTANCE hinsMouse;
(4)添加钩子函数
1
LRESULT __declspec(dllexport)__stdcall CALLBACK MouseProc(
2
int nCode,
3
WPARAM wParam,
4
LPARAM lParam)
5
{
6
LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT *)lParam;
7
if(nCode>=0)
8
{
9
if(wParam == WM_RBUTTONDOWN)
10
{
11
HWND hTargetHwnd=lpMouse->hwnd; //得到鼠标所在窗口句柄
12
if(hTargetHwnd)
13
{
14
char caption[256]={'\0'};
15
::GetWindowText(hTargetHwnd, caption, sizeof(caption)); //得到它的样式
16
fm=fopen("c:\\mouse.txt","a+");
17
fputs(caption,fm);
18
fputs("\n",fm);
19
fclose(fm);
20
}
21
}
22
23
24
}
25
26
return CallNextHookEx( mouse, nCode, wParam, lParam );
27
28
}
1
BOOL __declspec(dllexport)__stdcall installhook()
2
{
3
fm=fopen("c:\\mouse.txt","w");
4
fclose(fm);
5
6
mouse =SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hinsMouse,0);
7
8
return TRUE;
9
}
10
11
12
BOOL __declspec(dllexport) UnHook()
13
{
14
15
BOOL unhooked = UnhookWindowsHookEx(mouse);
16
return unhooked;
17
}
(5)添加导出函数
1
; mousehook.def : Declares the module parameters for the DLL.
2
3
LIBRARY "mousehook"
4
DESCRIPTION 'mousehook Windows Dynamic Link Library'
5
6
EXPORTS
7
; Explicit exports can go here
8
MouseProc
9
installhook
(6)写挂钩函数