一,Dll的简单使用
使用 一个DLL,一般需要另外两个文件.H和.LIB。.H文件或.LIB文件。.H文件可用于使用.DLL的客户或是.DLL文件本身,其作用编译时期。.LIB文件是一个引入苦,用于客户程序,作用在链接时期。.DLL文件当然作用于运行时期了。
打开VS2008,选择Win32,DLL空项目。新建一个DLL.CPP和DLL.H文件。
- //DLL.H
- #ifdef DLL_API
- #else
- #define DLL_API _declspec(dllimport)
- #endif
- DLL1_API int add(int a,int b);
- DLL1_API int subtract(int a,int b);
- class DLL1_API Point
- {
- public:
- void output(int x,int y);
- };
- //DLL.CPP
- #define DLL_API _declspec(dllexport)
- #include "Dll.h"
- #include <stdio.h>
- int add(int a,int b)
- {
- return a+b;
- }
- int subtract(int a,int b)
- {
- return a-b;
- }
- void Point::output(int x,int y)
- {
- printf("x = %d,y = %d",x,y);
- }
- //Dll应用端
- #include <iostream>
- #include "Dll.h"
- using namespace std;
- //加载动态链接库
- #pragma comment(lib,"Dll.lib")
- int main()
- {
- cout<<add(2,3);
- Point p;
- p.output(2,3);
- }
在C++中对函数名字的解析和C语言中方式不一样,因为C++支持重载的缘故,为了不同的语言都可以使用同一个DLL,我可以这样:
在.H文件里更改为:#define DLL_API extern "C" _declspec(dllimport)
在.CPP文件里更正为:#define DLL_API extern "C" _declspec(dllexport)
注意:C一定要大写,这样导出函数名是以C命名的方式。
在不同的不同的语言中,函数的调用规则是不一样的,在C语言中式C调用规则,在Dephi中是PASCAL(标准调用)调用规则中,为了不同的语言可以使用同一个DLL,我们需要更改函数的调用规则,例如:
.H文件中:DLL1_API int _stdcall add(int a,int b);
.CPP文件中实现add实现时也应加入_stdcall。
但这样会更改导出的函数名,这又与extern "C"向冲突。
解决上述文件的方式是是用.DEF文件,在vs2008中,可以新建一个,格式如下:
LIBRARY “Dll”
EXPORTS
add
subtract
使用动态DLL,有两种方式,隐式调用和显示调用。
#pragma comment(lib,"Dll.lib")
这是隐式的,程序启动时,把所有的函数都映射进去,但有时我们只需要一个,不必要这么多,这是使用显示调用。
使用显示调用,要使用以下两个函数:
1.HMODULE WINAPI LoadLibrary(LPCTSTR lpFileName);
2.FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
二,Hook的简单使用
先看一个函数:
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod, DWORD dwThreadId);
参数意义:
idHook参数可以取如下常量:
WH_CALLWNDPROC //窗口钩子,当系统向目标窗口发送消息时将触发此钩子
WH_CALLWNDPROCRET //窗口钩子,当窗口处理完消息后将触发此钩子
WH_CBT //当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件
WH_DEBUG //调试钩子
WH_GETMESSAGE //当往消息队列中增加一个消息时将触发此钩子
WH_JOURNALPLAYBACK //回放钩子,可以用于播放已记录的鼠标和键盘的操作
WH_JOURNALRECORD //记录钩子,可以用于记录鼠标和键盘的操作,木马程序可以使用此钩子窃取受控方在屏幕中敲入的密码
WH_KEYBOARD //当敲击键盘时将触发此钩子
WH_MOUSE //当有鼠标操作时将触发此钩子
WH_MSGFILTER //消息过滤钩子
WH_SHELL //Shell钩子
WH_SYSMSGFILTER //系统消息过滤钩子
lpfn参数
是一钩子过程,不同的钩子有不同的钩子过程。如果是全局钩子,该函数在DLL中,如果不是在当前进程中。
hMod参数:
指向DLL的句柄,如果dwThreadId是当前进程的一个线程ID并且钩子处理函数在当前进程中,hMod一定要为NULL。
dwThreadId参数:
如果是全局钩子该参数就为0,如果不是就是当前进程的一个线程ID
2.卸载一个HOOL
BOOL UnhookWindowsHookEx(HHOOK hhk);
例子1:非全局钩子
- // InnerHookDlg.cpp
- HHOOK g_hMouse;
- HWND g_hWnd=NULL;
- LRESULT CALLBACK MouseProc(
- int nCode, // hook code
- WPARAM wParam, // message identifier
- LPARAM lParam // mouse coordinates
- )
- {
- return 1;
- }
- LRESULT CALLBACK KeyboardProc(
- int code, // hook code
- WPARAM wParam, // virtual-key code
- LPARAM lParam // keystroke-message information
- )
- {
- //if(VK_SPACE==wParam || VK_RETURN==wParam)
- //Alt+F4
- /*if(VK_F4==wParam && (1==(lParam>>29 & 1)))
- return 1;
- else
- return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/
- //按F2退出程序
- if(VK_F2==wParam)
- {
- ::SendMessage(g_hWnd,WM_CLOSE,0,0);
- UnhookWindowsHookEx(g_hKeyboard);
- UnhookWindowsHookEx(g_hMouse);
- }
- return 1;
- }
- BOOL CInnerHookDlg::OnInitDialog()
- {
- //...............
- g_hWnd=m_hWnd;
- g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
- g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
- return TRUE;
- }
例子2:全局钩子
- //Hook.CPP
- #include <windows.h>
- HHOOK g_hMouse=NULL;
- HHOOK g_hKeyboard=NULL;
- //共享g_hWnd
- #pragma data_seg("MySec")
- HWND g_hWnd=NULL;
- #pragma data_seg()
- LRESULT CALLBACK MouseProc(
- int nCode, // hook code
- WPARAM wParam, // message identifier
- LPARAM lParam // mouse coordinates
- )
- {
- return 1;
- }
- LRESULT CALLBACK KeyboardProc(
- int code, // hook code
- WPARAM wParam, // virtual-key code
- LPARAM lParam // keystroke-message information
- )
- {
- if(VK_F2==wParam)
- {
- SendMessage(g_hWnd,WM_CLOSE,0,0);
- UnhookWindowsHookEx(g_hMouse);
- UnhookWindowsHookEx(g_hKeyboard);
- }
- return 1;
- }
- void SetHook(HWND hwnd)
- {
- g_hWnd=hwnd;
- g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
- g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
- }
- //.DEF
- LIBRARY Hook
- EXPORTS
- SetHook @2
- SEGMENTS
- MySec READ WRITE SHARED
在.DEF文件中
SetHook @2
意思是制定SetHook在DLL中的位置
SEGMENTS
MySec READ WRITE SHARED
意思共享在.DLL中的MySec。