我正在尝试使用CreateProcessA
来调用%appdata%
目录下的应用程序。
例如,使用以下内容:
CreateProcessA(
NULL, "%appdata%\myfile.exe", NULL, NULL, FALSE,
CREATE_NO_WINDOW, NULL, NULL, &sI, &pI
);
调用myfile.exe
时是否需要使用完整路径?或者我可以在调用%appdata%
时使用CreateProcessA
吗?
答案 0 :(得分:1)
正如MSDN中所述,并且由于您将NULL
作为第一个参数传递给CreateProcessA
,CreateProcessA
的第二个参数:lpApplicationName
是扮演要执行的命令行的角色。除非lpApplicationName
指向目录中的exe,否则系统将按以下顺序查找
- 加载应用程序的目录。
- 父进程的当前目录。
- 32位Windows系统目录。使用GetSystemDirectory 函数来获取此目录的路径
- 16位Windows系统目录。没有任何功能 获取此目录的路径,但搜索它。的名字 这个目录是系统。 Windows目录。使用 GetWindowsDirectory函数获取此目录的路径。
- PATH环境变量中列出的目录。 请注意,此函数不会搜索每个应用程序路径 由App Paths注册表项指定。包括这个 在搜索序列中的每个应用程序路径,使用ShellExecute 功能
醇>
因此,除非CreateProcessA
的第二个参数的格式为{directory}/{executable_name}.{ext}
,否则您必须:
如Ben所述,请查看ExpandEnvironmentStrings以修改PATH env变量。
答案 1 :(得分:1)
CreateProcess
中的第二个参数应该是可写缓冲区。如果您的可执行文件路径不包含命令行参数,则将可执行文件路径放在第一个参数中,并保留第二个参数NULL
对于Windows Vista及更高版本,请使用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);
}