CreateProcessA%appdata%

时间:2018-05-21 20:43:52

标签: c windows appdata

我正在尝试使用CreateProcessA来调用%appdata%目录下的应用程序。

例如,使用以下内容:

CreateProcessA(
    NULL, "%appdata%\myfile.exe", NULL, NULL, FALSE,
    CREATE_NO_WINDOW, NULL, NULL, &sI, &pI
);

调用myfile.exe时是否需要使用完整路径?或者我可以在调用%appdata%时使用CreateProcessA吗?

2 个答案:

答案 0 :(得分:1)

正如MSDN中所述,并且由于您将NULL作为第一个参数传递给CreateProcessACreateProcessA的第二个参数:lpApplicationName是扮演要执行的命令行的角色。除非lpApplicationName指向目录中的exe,否则系统将按以下顺序查找

  
      
  1. 加载应用程序的目录。
  2.   
  3. 父进程的当前目录。
  4.   
  5. 32位Windows系统目录。使用GetSystemDirectory       函数来获取此目录的路径
  6.   
  7. 16位Windows系统目录。没有任何功能       获取此目录的路径,但搜索它。的名字       这个目录是系统。 Windows目录。使用       GetWindowsDirectory函数获取此目录的路径。
  8.   
  9. PATH环境变量中列出的目录。       请注意,此函数不会搜索每个应用程序路径       由App Paths注册表项指定。包括这个       在搜索序列中的每个应用程序路径,使用ShellExecute       功能
  10.   

因此,除非CreateProcessA的第二个参数的格式为{directory}/{executable_name}.{ext},否则您必须:

  1. 将executable_name放在加载应用程序的同一目录中
  2. 将executable_name放在父进程的同一目录中
  3. 将executable_name放在Windows System32目录中:C:\ Windows \ System32
  4. 将executable_name放在Windows目录中:C:\ Windows
  5. 包括可执行名称在PATH中的目录
  6. 如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);
}