一丶簡介
在System權限啟動我們的程序之后.如果程序內部使用了GetTempPath()函數.或者使用了其它跟用戶權限有關的函數.則獲取的路徑不是你想要的.
比如 你在System權限下使用了GetTempPath() 那么獲取的temp路徑有可能就是 "C:\Windows\Temp" 而我們想要獲取的路徑則是 "C:\user\xxx\Appdata\local\temp"
這里貼出代碼. 原理就是 使用用戶權限的Token 配合函數ExpandEnvironmentStringsForUserW 函數來獲取.
二丶代碼
#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:\Users\ibinary\AppData\Roaming""
通過你自己的拼接路徑就可以拼接處Temp路徑了.
也可以直接輸入%temp%來獲取.