我试图使用CreateProcessA调用%appdata%目录下的应用程序。
例如,使用以下内容:
CreateProcessA(
NULL, "%appdata%\myfile.exe", NULL, NULL, FALSE,
CREATE_NO_WINDOW, NULL, NULL, &sI, &pI
);调用myfile.exe时是否需要使用完整的路径,还是在调用CreateProcessA时可以使用%appdata%
发布于 2018-05-21 21:08:35
正如MSDN中所述,由于您将NULL作为第一个参数传递给CreateProcessA,CreateProcessA的第二个参数:lpApplicationName正在扮演要执行的命令行的角色。除非lpApplicationName指向目录中的exe,否则系统将按以下顺序查找。
因此,除非CreateProcessA的第二个参数以{directory}/{executable_name}.{ext}形式存在,否则您将不得不这样做:
如Ben所述,请查看ExpandEnvironmentStrings以修改PATH env变量。
发布于 2018-05-22 02:01:50
CreateProcess中的第二个参数应该是可写缓冲区。如果可执行路径不包括命令行参数,则将可执行路径放在第一个参数中,并保留第二个参数NULL。
对于Windows及以上版本,请使用SHGetKnownFolderPath
FOLDERID_LocalAppData返回"c:\\users\\username\\AppData\\Local"
FOLDERID_RoamingAppData返回"c:\\users\\username\\AppData\\Roaming"
ExpandEnvironmentStrings("%APPDATA%", ...)返回与FOLDERID_RoamingAppData相同的内容
除非您确信用户名与ANSI兼容,否则应该使用Unicode。
wchar_t *ptr;
if(S_OK == SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &ptr))
{
//or FOLDERID_LocalAppData
std::wstring path = ptr;
CoTaskMemFree(ptr);
STARTUPINFOW si = { sizeof(si) };
PROCESS_INFORMATION pi;
path += L"\\myfile.exe";
CreateProcessW(NULL, &path[0], NULL, NULL, FALSE,
CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
}https://stackoverflow.com/questions/50456382
复制相似问题