Я использую пример отсюда, чтобы перезапустить приложение:
Перезапустите приложение самостоятельно
Это работает хорошо. Пока я не захочу взять параметр, переданный в приложение, и передать его экземпляру перезапуска.
lstrcpy(tbuf, lpCmdLine);
lstrcat(tbuf, L"OSP_PID.EXE ");
lstrcat(tbuf, lpCmdLine);
wsprintf(buf, L"/C ping 127.0.0.1 -n 5 && \"%s \"" , tbuf);
ExecWin(L"cmd.exe", buf, TRUE);
PostMessage(hWnd, WM_CLOSE, 0, 0L);buf== L"/C ping 127.0.0.1 -n 5 && \"C:\\VEC25WIN8\\DEBUG\\OSP_PID.EXE C:\\VEC25WIN8\\DEBUG\\ \""
//lstrcat(tbuf, lpCmdLine);
buf== L"/C ping 127.0.0.1 -n 5 && \"C:\\VEC25WIN8\\DEBUG\\OSP_PID.EXE \""
В первом примере это то, что я пытаюсь выполнить. Пинг работает но потом ничего.
Второй пример показывает, что переданный аргумент удален. Это работает, приложение запускается, но аргумент не передается.
«Buf ==» от панели WATCH отладки.
Я не вижу в этом ничего плохого. Пожалуйста, порекомендуйте.
Boyd
static void ExecWin(LPTSTR acTaskname, LPTSTR acParameters, int nShow )
{ // everything is on the stack - reenterable
SHELLEXECUTEINFO execinfo;
ZeroMemory(&execinfo, sizeof(SHELLEXECUTEINFO));
execinfo.cbSize = sizeof(SHELLEXECUTEINFO);
execinfo.lpParameters = acParameters;
execinfo.lpFile = acTaskname;
execinfo.nShow = nShow;
if ((ShellExecuteEx(&execinfo)) && ((int)execinfo.hInstApp > 32))
{
return;
}
return;
}
Я верю &&
в командной строке особенность командной строки. ShellExecute не собирается обращать на это внимание. Он считает, что это просто еще один параметр первой команды в строке (пинг).
Ваши варианты:
Вместо этого раскрутите процесс cmd.exe и передайте ему командную строку, используя /C
, (Подробнее читайте в /C
опция для cmd.exe.)
Заставьте вашу программу выдавать две команды отдельно. Если вам нужно убедиться, что команда ping завершается успешно до второй, вам может потребоваться использовать CreateProcess вместо ShellExecute. CreateProcess предоставит вам дескрипторы, необходимые для ожидания процесса и проверки статуса его выхода.
Других решений пока нет …