iga*_*l k 3 c++ windows winapi windows-xp windows-7
这里描述的MSDN备注部分特别提到了以下函数的加载类型之间存在差异.
由于我的模块是可移植的并且动态加载模型,因此我不允许/能够使用任何预处理器命令:
#if (PSAPI_VERSION == 2)
(GetProcAddress("kernel32.dll", OBFUSCATE(L"K32GetMappedFileNameW")));
#elif (PSAPI_VERSION == 1)
(GetProcAddress("psapi.dll", OBFUSCATE(L"GetMappedFileNameW")));
#endif
Run Code Online (Sandbox Code Playgroud)
此外 -
Windows 7和Windows Server 2008 R2上的Kernel32.dll; Windows 7和Windows Server 2008 R2上的Psapi.dll(如果PSAPI_VERSION = 1); Windows Server 2008,Windows Vista,Windows Server 2003和Windows XP上的Psapi.dll
不清楚Windows版本如何与PSAPI版本完全协调.
该GetMappedFileName()文件明确指出:
从Windows 7和Windows Server 2008 R2开始,Psapi.h为PSAPI函数建立版本号.PSAPI版本号会影响用于调用函数的名称以及程序必须加载的库.
如果PSAPI_VERSION为2或更大,则此函数在Psapi.h中定义为K32GetMappedFileName,并在Kernel32.lib和Kernel32.dll中导出.如果PSAPI_VERSION为1,则此函数在Psapi.h中定义为GetMappedFileName,并在Psapi.lib和Psapi.dll中导出为调用K32GetMappedFileName的包装器.
必须在早期版本的Windows以及Windows 7及更高版本上运行的程序应始终将此函数称为GetMappedFileName.要确保正确解析符号,请将Psapi.lib添加到TARGETLIBS宏并使用-DPSAPI_VERSION = 1编译该程序.要使用运行时动态链接,请加载Psapi.dll.
如果静态链接不适合您,并且您需要在运行时动态加载函数而不使用#ifdef语句,那么只需无条件地检查两个DLL,例如:
typedef DWORD WINAPI (*LPFN_GetMappedFileNameW)(HANDLE hProcess, LPVOID lpv, LPWSTR lpFilename, DWORD nSize);
HINSTANCE hPsapi = NULL;
LPFN_GetMappedFileNameW lpGetMappedFileNameW = NULL;
...
lpGetMappedFileNameW = (LPFN_GetMappedFileNameW) GetProcAddress(GetModuleHandle("kernel32.dll"), L"K32GetMappedFileNameW"));
if (lpGetMappedFileNameW == NULL)
{
hPsapi = LoadLibraryW(L"psapi.dll");
lpGetMappedFileNameW = (LPFN_GetMappedFileNameW) GetProcAddress(hPsapi, L"GetMappedFileNameW");
}
// use lpGetMappedFileNameW() as needed ...
if (hPsapi)
FreeLibrary(hPsapi);
Run Code Online (Sandbox Code Playgroud)
或者,只需执行文档所说的内容 - 完全忽略kernel32并在所有Windows版本上单独使用psapi.dll.在Windows 7及更高版本中,psapi.GetMappedFileNameW()是一个包装器kernel32.K32GetMappedFileNameW().
typedef DWORD WINAPI (*LPFN_GetMappedFileNameW)(HANDLE hProcess, LPVOID lpv, LPWSTR lpFilename, DWORD nSize);
HINSTANCE hPsapi = NULL;
LPFN_GetMappedFileNameW lpGetMappedFileNameW = NULL;
...
hPsapi = LoadLibraryW(L"psapi.dll");
lpGetMappedFileNameW = (LPFN_GetMappedFileNameW) GetProcAddress(hPsapi, L"GetMappedFileNameW");
// use lpGetMappedFileNameW() as needed ...
FreeLibrary(hPsapi);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1524 次 |
| 最近记录: |