Windows API GetProcAddress 及demo code

GetProcAddress函數檢索指定的動態鏈接庫(DLL)中的輸出庫函數地址。

  函數原型:

  FARPROC GetProcAddress(

  HMODULE hModule, // DLL模塊句柄

  LPCSTR lpProcName// 函數名

  );

 參數:

 hModule

  [in] 包含此函數的DLL模塊的句柄。LoadLibrary、AfxLoadLibrary?或者GetModuleHandle函數可以返回此句柄。

  lpProcName

  [in] 包含函數名的以NULL結尾的字符串,或者指定函數的序數值。如果此參數是一個序數值,它必須在一個字的底字節,高字節必須為0。

  返回值:

  如果函數調用成功,返回值是DLL中的輸出函數地址。

  如果函數調用失敗,返回值是NULL。得到進一步的錯誤信息,調用函數GetLastError。

?

FARPROC 是一個4字節指針,指向一個函數的內存地址,例如
GetProcAddress 的返回類型就是一個FARPROC。
如果你要存放這個地址,可以聲明以一個 FARPROC變量來存放。

?

GetProcAddress返回的是一個函數地址的指針。
聲明:FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);
你應該知道你要的函數的類型是什么,可以用typedef的方法定義函數類型,然后定義一個這種類型的變量,你得到地址后,將地址的類型轉換并存到那個變量中就行了。例如:

?這是RunHook定義:
BOOL _stdcall RunHook(HMODULE hModule,DWORD dwThreadId)
{
HWndHook=::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HOOKProc,hMod,dwThreadId);
return TRUE;
}

這是全局聲明:
typedef BOOL (_stdcall *funRunHook)(HMODULE hModule,DWORD dwThreadID);

這兩種調用都不行:
funRunHook RunHook;
RunHook=(funRunHook)GetProcAddress(hMod,"RunHook");


LoadLibrary
Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

說明

載入指定的動態鏈接庫,并將它映射到當前進程使用的地址空間。一旦載入,即可訪問庫內保存的資源

返回值

Long,成功則返回庫模塊的句柄,零表示失敗。會設置GetLastError
參數 類型及說明
lpLibFileName String,指定要載入的動態鏈接庫的名稱。采用與CreateProcess函數的lpCommandLine參數指定的同樣的搜索順序
注解
一旦不需要,用FreeLibrary函數釋放DLL

**********************************************************************************************************************************************************

原文:http://blog.csdn.net/g5dsk/article/details/6680698


使用?GetProcAddress?Function?時,有以下幾點需要特別留意:

1. 第二個參數類型是?LPCSTR,不是?LPCTSTR

2. 用?__declspec(dllexport),按?C?名稱修飾(extern "C") 導出的函數名,對于?__stdcall?和?__fastcall?調用約定是相同的;對?__cdecl?是不同的(導出的函數名沒有前面的下劃線);

3. 即使返回值不是?NULL,也有可能發生錯誤。當 .def 模塊不是連續地從 1 開始編號 ordinal 值,那么,如果用一個無函數對應的 ordinal 值調用?GetProcAddress,就會發生錯誤,返回一個無效的非?NULL?地址;?

4. 最好用函數名,而不是 ordinal 值調用?GetProcAddress,以避免不同版本 Dll 中某些函數不存在的情況。

注:確認 Dll 的導出函數名,可以用?DUMPBIN /EXPORTS dll_file_name.dll?命令,然后查看?name?列。

[cpp]?view plain?copy
?print?
  1. //?The?myPuts?function?writes?a?null-terminated?string?to??
  2. //?the?standard?output?device.??
  3. ???
  4. //?The?export?mechanism?used?here?is?the?__declspec(export)??
  5. //?method?supported?by?Microsoft?Visual?Studio,?but?any??
  6. //?other?export?method?supported?by?your?development??
  7. //?environment?may?be?substituted.??
  8. ???
  9. ???
  10. #include?<windows.h>??
  11. ???
  12. #define?EOF?(-1)??
  13. ???
  14. #ifdef?__cplusplus????//?If?used?by?C++?code,???
  15. extern?"C"?{??????????//?we?need?to?export?the?C?interface??
  16. #endif??
  17. ???
  18. __declspec(dllexport)?int?__cdecl?myPuts(LPTSTR?lpszMsg)?//?__cdecl?|?__stdcall?|?__fastcall??
  19. {??
  20. ????DWORD?cchWritten;??
  21. ????HANDLE?hStdout;??
  22. ????BOOL?fRet;??
  23. ???
  24. ????//?Get?a?handle?to?the?standard?output?device.??
  25. ???
  26. ????hStdout?=?GetStdHandle(STD_OUTPUT_HANDLE);??
  27. ????if?(INVALID_HANDLE_VALUE?==?hStdout)??
  28. ????????return?EOF;??
  29. ???
  30. ????//?Write?a?null-terminated?string?to?the?standard?output?device.??
  31. ???
  32. ????while?(*lpszMsg?!=?'\0')??
  33. ????{??
  34. ????????fRet?=?WriteFile(hStdout,?lpszMsg,?1,?&cchWritten,?NULL);??
  35. ????????if(?(FALSE?==?fRet)?||?(1?!=?cchWritten)?)??
  36. ????????????return?EOF;??
  37. ????????lpszMsg++;??
  38. ????}??
  39. ???
  40. ????return?1;??
  41. }??
  42. ???
  43. #ifdef?__cplusplus??
  44. }??
  45. #endif??
[cpp]?view plain?copy
?print?
  1. //?A?simple?program?that?uses?LoadLibrary?and???
  2. //?GetProcAddress?to?access?myPuts?from?Myputs.dll.???
  3. ???
  4. #include?<stdio.h>???
  5. #include?<windows.h>???
  6. ???
  7. typedef?int?(__cdecl?*MYPROC)(LPTSTR);?//?__cdecl?|?__stdcall?|?__fastcall??
  8. ???
  9. VOID?main(VOID)???
  10. {???
  11. ????HINSTANCE?hinstLib;???
  12. ????MYPROC?ProcAdd;???
  13. ????BOOL?fFreeResult,?fRunTimeLinkSuccess?=?FALSE;???
  14. ???
  15. ????//?Get?a?handle?to?the?DLL?module.??
  16. ???
  17. ????hinstLib?=?LoadLibrary(TEXT("bin\\Myputs"));?//?雖然?MSDN?Library?說這里如果??
  18. ?????????????????????????????????????????????????//?指定了路徑,要用?backslashes?(\),??
  19. ?????????????????????????????????????????????????//?不要用?forward?slashes?(/),但??
  20. ?????????????????????????????????????????????????//?其實用二者都可以。??
  21. ?????????????????????????????????????????????????//?注:如果用?\,要用?\\。??
  22. ???
  23. ????//?If?the?handle?is?valid,?try?to?get?the?function?address.??
  24. ???
  25. ????if?(hinstLib?!=?NULL)???
  26. ????{???
  27. ????????ProcAdd?=?(MYPROC)GetProcAddress(hinstLib,?"myPuts");?//?__cdecl???:?myPuts??
  28. ??????????????????????????????????????????????????????????????//?__stdcall?:?_myPuts@4??
  29. ??????????????????????????????????????????????????????????????//?__fastcall:?@myPuts@4??
  30. ???
  31. ????????//?If?the?function?address?is?valid,?call?the?function.??
  32. ???
  33. ????????if?(NULL?!=?ProcAdd)???
  34. ????????{??
  35. ????????????fRunTimeLinkSuccess?=?TRUE;??
  36. ????????????(ProcAdd)?(TEXT("Message?via?DLL?function\n"));???
  37. ????????}??
  38. ???
  39. ????????//?Free?the?DLL?module.??
  40. ???
  41. ????????fFreeResult?=?FreeLibrary(hinstLib);???
  42. ????}???
  43. ???
  44. ????//?If?unable?to?call?the?DLL?function,?use?an?alternative.??
  45. ???
  46. ????if?(!?fRunTimeLinkSuccess)???
  47. ????????printf("Message?via?alternative?method\n");???
  48. } ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【操作系統】進程管理

進程管理 進程的基本概念 程序的順序執行及其特征 程序的順序執行:僅當前一操作(程序段)執行完后&#xff0c;才能執行后續操作。 程序順序執行時的特征&#xff1a;順序性&#xff0c;封閉性&#xff0c;可再見性。 前趨圖 前趨圖(Precedence Graph)是一個有向無循環圖&#…

va_list va_start va_end的使用

<pre name"code" class"cpp" style"color: rgb(51, 51, 51); white-space: pre-wrap; word-wrap: break-word;"><strong>一、 從printf()開始</strong> 從大家都很熟悉的格式化字符串函數開始介紹可變參數函數。 原型&#xf…

Linux學習之CentOS(三)----將Cent0S 7的網卡名稱eno16777736改為eth0

【正文】 Linux系統版本&#xff1a;CentOS_7&#xff08;64位&#xff09; 一、前言&#xff1a; 今天又從Centos 6.5裝回了Centos 7&#xff0c;畢竟還是要順應潮流嘛。安裝完成之后&#xff0c;發現發現CentOS 7默認的網卡名稱是eno16777736&#xff0c;如圖所示&#xff1a…

本地音頻播放,使用AVFoundation.framework中的AVAudioPlayer來實現

本地音頻播放,使用AVfoundation.framework中的AVAudioPlayer來實現 /*AVAudioPlayer的使用比較簡單: 1、初始化AVAudioPlayer對象&#xff0c;此時通常指定本地文件路徑 2、設置播放器屬性&#xff0c;例如重復次數、音量大小等 3、調用play方法播放。 */

AngularJS操作DOM——angular.element

addClass()-為每個匹配的元素添加指定的樣式類名after()-在匹配元素集合中的每個元素后面插入參數所指定的內容&#xff0c;作為其兄弟節點append()-在每個匹配元素里面的末尾處插入參數內容attr() - 獲取匹配的元素集合中的第一個元素的屬性的值bind() - 為一個元素綁定一個事…

C++中operator的主要用法

1&#xff0e; operator 用于類型轉換函數&#xff1a; 類型轉換函數的特征&#xff1a; 1&#xff09; 型轉換函數定義在源類中&#xff1b; 2&#xff09; 須由 operator 修飾&#xff0c;函數名稱是目標類型名或目標類名&#xff1b; 3&#xff09; 函數沒有參數&#x…

聲紋識別

一、 聲紋識別是一項根據語音波形中反映說話人生理和行為特征的語音參數&#xff0c;自動識別說話人身份的技術。與語音識別不同的是&#xff0c;聲紋識別利用的是語音信號中的說話人身份信息&#xff0c;而不考慮語音中的字詞意思。由于每個人的生物特征具有與其他人不同的唯一…

Asp.net mvc 實時生成縮率圖到硬盤

之前對于縮率圖的處理是在圖片上傳到服務器之后&#xff0c;同步生成兩張不同尺寸的縮率供前端調用&#xff0c;剛開始還能滿足需求&#xff0c;慢慢的隨著前端展示的多樣化&#xff0c;縮率圖已不能前端展示的需求&#xff0c;所以考慮做一個實時生成圖片縮率圖服務。 每次調用…

數據庫事務的隔離機制

數據庫事務(Database Transaction) &#xff0c;是指作為單個邏輯工作單元執行的一系列操作&#xff0c;要么完全地執行&#xff0c;要么完全地不執行。----百度百科就是說你定義一組數據庫操作&#xff0c;然后告訴數據庫說這些操作要么都成功&#xff0c;要么都不成功。類似于…

如何使用CppUnit進行單元測試

http://www.vckbase.com/document/viewdoc/?id1762 一、前言 測試驅動開發(TDD)是以測試作為開發過程的中心&#xff0c;它堅持&#xff0c;在編寫實際代碼之前&#xff0c;先寫好基于產品代碼的測試代碼。開發過程的目標就是首先使測試能夠通過&#xff0c;然后再優化設計結構…

錄制wav格式的音頻

項目中有面部認證、聲紋認證&#xff0c;服務器端要求上傳wav格式的音頻&#xff0c;所以寫了這樣一個小demo。 剛剛開始寫博客還不知道怎么上傳代碼&#xff0c;就復制了&#xff0c;嘻嘻 DotimeManage.h class DotimeManage; protocol DotimeManageDelegate <NSObject&g…

iOS開發網絡篇—Reachability檢測網絡狀態

前言&#xff1a;當應用程序需要訪問網絡的時候&#xff0c;它首先應該檢查設備的網絡狀態&#xff0c;確認設備的網絡環境及連接情況&#xff0c;并針對這些情況提醒用戶做出相應的處理。最好能監聽設備的網絡狀態的改變&#xff0c;當設備網絡狀態連接、斷開時&#xff0c;程…

網絡七層協議 五層模型 TCP連接 HTTP連接 socket套接字

socket&#xff08;套接字&#xff09;是通信的基石&#xff0c;是支持TCP/IP協議的網絡通信的基本操作單元&#xff0c;包含進行網絡通信必須的五種信息&#xff1a;連接使用的協議&#xff0c;本地主機的IP地址&#xff0c;本地進程的協議端口&#xff0c;遠地主機的IP地址&a…

[vs2010 project] CppUnit快速入門

簡介 測試是軟件開發過程中極其重要的一環&#xff0c;詳盡周密的測試能夠減少軟件BUG&#xff0c;提高軟件品質。測試包括單元測試、系統測試等。其中單元測試是指針對軟件功能單元所作的測試&#xff0c;這里的功能單元可以是一個類的屬性或者方法&#xff0c;測試的目的是看…

[javascript|基本概念|Number]學習筆記

Number類型的值&#xff1a;整數/浮點數值 整數 十進制 e.g.: var intNum 50; 八進制 (嚴格模式下無效,解析錯誤)字面值首位必須是0,之后的數字序列為0&#xff5e;7 e.g.: var intNum 070; //解析為十進制56 (如果字面值數值超出了范圍&#xff0c;前導0將被忽略&#xf…

[轉]深入理解linux內核list_head

http://blog.chinaunix.net/uid-27122224-id-3277511.html 深入理解linux內核list_head的實現 2012-07-17 17:37:01 分類&#xff1a; LINUX 前言&#xff1a;在linux源代碼中有個頭文件為list.h。很多linux下的源代碼都會使用這個頭文件&#xff0c;它里面定義 了一個結構,以及…

xcode左側不顯示工程文件目錄,提示NO Filter Results

解決辦法&#xff1a; What solved was to go to Navigate > Reveal in Project Navigator . After this, the structure appeared again.

【VC++技術雜談005】如何與程控儀器通過GPIB接口進行通信

在工控測試系統中&#xff0c;經常需要使用到各類程控儀器&#xff0c;這些程控儀器通常具有GPIB、LAN、USB等硬件接口&#xff0c;計算機通過這些接口能夠與其通信&#xff0c;從而實現自動測量、數據采集、數據分析和數據處理等操作。本文主要介紹如何與程控儀器通過GPIB接口…

標題在上邊框中的html(fieldset標簽)

<fieldset> <legend>標題</legend> 內容 </fieldset> 轉載于:https://www.cnblogs.com/lswbk/p/4952820.html

移除項目中的CocoaPods

在項目中移除CocoaPods cocoaPods雖然很方便&#xff0c;但是我是真心的不喜歡用它&#xff0c;總是出錯如果你覺得CocoaPods讓你的項目出現了問題&#xff0c;不好用甚至是惡心&#xff0c;想將其從項目中徹底移除&#xff0c;也有方法&#xff1a; 1.刪除工程文件夾下的Podf…