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的最大字符数量


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