win32/VC庫函數之LoadLibrary()、GetModuleHandle()、GetModuleFileName()



1、LoadLibrary是把一個模塊映射進調用進程的地址空間,需要時增加引用計數,每調用一次,引用計數增加一,需要通過相同步驟地調用FreeLibrary()來減少引用次數,當爲0時,系統卸載DLL。

HMODULE WINAPI LoadLibrary(
  __in  LPCTSTR lpFileName
);

HMODULE WINAPI LoadLibrary(
  __in  LPCTSTR lpFileName
);

lpFileName 如果提供了路徑(須使用backslashes(\),不要使用(/) ),則按照路徑搜索,否則按照標準搜索方法去查找指定的執行文件名字。
如果指定文件名沒有後綴,則默認追加".dll",如果名字以“.”結尾,則不追加。


2、GetModuleHandle是返回一個已經映射進調用進程地址空間的模塊的句柄,並不增加引用計數。

HMODULE WINAPI GetModuleHandle(
  __in_opt  LPCTSTR lpModuleName
);

補充說明

LPCTSTR類型:
L表示long指針 這是爲了兼容Windows 3.1等16位操作系統遺留下來的,在win32中以及其他的32位操作系統中, long指針和near指針及far修飾符都是爲了兼容的作用。沒有實際意義。P表示這是一個指針。C表示是一個常量。T表示在Win32環境中, 有一個_T宏。STR表示這個變量是一個字符串。
LPCTSTR表示一個指向常固定地址的可以根據一些宏定義改變語義的字符串。同樣,LPCSTR就只能是一個ANSI字符串,在程序中我們大部分時間要使用帶T的類型定義。LPCTSTR == const TCHAR *  CString 和 LPCTSTR 可以說通用。 原因在於CString定義的自動類型轉換,沒什麼奇特的,最簡單的C++操作符重載而已。  常量字符串ansi和unicode的區分是由宏_T來決定的。但是用_T("abcd")時, 字符串"abcd"就會根據編譯時的是否定一_UNICODE來決定是char* 還是 w_char*。 同樣,TCHAR 也是相同目的字符宏。 看看定義就明白了。簡單起見,下面只介紹 ansi 的情況,unicode 可以類推。

3、GetModuleFileName

獲取當前進程已加載模塊的文件的完整路徑,該模塊必須由當前進程加載。
如果想要獲取另一個已加載模塊的文件路徑,可以使用GetModuleFileNameEx函數

【C++函數原型】:

 
DWORD WINAPI GetModuleFileName(
    _In_opt_  HMODULE hModule,
    _Out_     LPTSTR lpFilename,
    _In_      DWORD nSize);

返回值
Long,如執行成功,返回複製到lpFileName的實際字符數量;零表示失敗。使用GetLastError可以打印錯誤信息。

參數

hModule Long

一個模塊的句柄。可以是一個DLL模塊,或者是一個應用程序的實例句柄。如果該參數爲NULL,
該函數返回該應用程序全路徑。

【VC函數】

GetModuleFileName函數原型



DWORD GetModuleFileName(
  HMODULE  hModule,
  LPTSTR  lpFilename,
  DWORD  nSize
);

GetModuleFileName函數參數

HMODULE hModule 裝載一個程序實例的句柄。如果該參數爲NULL,該函數返回該當前應用程序全路徑。
LPTSTR lpFileName 是你存放返回的名字的內存塊的指針,是一個輸出參數
DWORD nSize,裝載到緩衝區lpFileName的最大值

GetModuleFileName函數返回值

如果返回爲成功,將在lpFileName的緩衝區當中返回相應模塊的路徑,如果所設的nSize過小,那麼返回僅按所設置緩衝區大小返回相應字符串內容。
如果函數失敗,返回值將爲0,利用GetLastError可獲得異常代碼。

GetModuleFileName頭文件

windows.h

lpFileName String

指定一個字串緩衝區,要在其中容納文件的用NULL字符中止的路徑名,hModule模塊就是從這個文件裝載進來的

nSize Long

裝載到緩衝區lpFileName的最大字符數量


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章