一丶简介
在System权限启动我们的程序之后.如果程序内部使用了GetTempPath()函数.或者使用了其它跟用户权限有关的函数.则获取的路径不是你想要的. 比如 你在System权限下使用了GetTempPath() 那么获取的temp路径有可能就是 "C:WindowsTemp" 而我们想要获取的路径则是 "C:userxxxAppdatalocaltemp" 这里贴出代码. 原理就是 使用用户权限的Token 配合函数ExpandEnvironmentStringsForUserW 函数来获取.
二丶代码
代码语言:javascript复制#include <TlHelp32.h>
#include <userenv.h>
#pragma comment(lib, "Userenv.lib")
BOOL ExpandSysEnvsByName(const WCHAR* envsName, std::wstring& envsPath)
{
HANDLE hToken = nullptr;
HANDLE hProcessSnap = nullptr;
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(PROCESSENTRY32);
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hProcessSnap)
return FALSE;
if (!Process32First(hProcessSnap, &pe32))
return FALSE;
do
{
if (_wcsicmp(pe32.szExeFile, L"explorer.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID);
if (NULL == hProcess)
return FALSE;
if (!OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken))
return FALSE;
CloseHandle(hProcessSnap);
break;
}
} while (Process32Next(hProcessSnap, &pe32));
WCHAR szEnvsPath[MAX_PATH] = { 0 };
if (!ExpandEnvironmentStringsForUserW(hToken, envsName, szEnvsPath, MAX_PATH))
return FALSE;
envsPath = szEnvsPath;
return TRUE;
}
int main()
{
wstring Ret;
ExpandSysEnvsByName(TEXT("%Appdata%"), Ret);
}
上方代码以appdata举例 %%这种环境变量大家可以多搜一下. 这里不整理了. 使用函数获取来的路径如下: Ret = "C:UsersibinaryAppDataRoaming"" 通过你自己的拼接路径就可以拼接处Temp路径了.