Второй параметр в CreateProcess
должен быть буфером для записи.Если ваш путь к исполняемому файлу не содержит аргументов командной строки, укажите путь к исполняемому файлу в первом параметре и оставьте второй параметр NULL
Для Windows Vista и выше используйте SHGetKnownFolderPath
FOLDERID_LocalAppData
возвращает "c:\\users\\username\\AppData\\Local"
FOLDERID_RoamingAppData
возвращает "c:\\users\\username\\AppData\\Roaming"
ExpandEnvironmentStrings("%APPDATA%", ...)
возвращает то же, что и FOLDERID_RoamingAppData
Вы должны использовать Unicode, если не уверены, что имя пользователя совместимо с ANSI.
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);
}