2016-03-18 3 views
0

Я использую пример здесь, чтобы перезапустить приложение:Application перезапускается

Restart an application by itself

Он хорошо работает. Пока я не хочу принять параметр, переданный в приложение, и передать его в экземпляр перезапуска.

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; 
} 
+1

У вас есть исходный код для 'ExecWin'? –

+2

вне темы: вы можете сэкономить много ручных манипуляций строк и потенциальных переполнений с помощью 'std :: wstring' – user4581301

+0

.................... – user3356861

ответ

1

Я считаю, что && в командной строке особенностью командной строки. ShellExecute не обратит на это внимания. Он считает, что это просто еще один параметр для первой команды на линии (пинг).

варианты:

  1. раскрутить процесс cmd.exe вместо этого, и передать командную строку, чтобы она с помощью /C. (Подробнее см. В опции /C для cmd.exe.)

  2. Сделайте свою программу двумя командами отдельно. Если вам нужно убедиться, что команда ping успешно завершилась до второго, вам может потребоваться использовать CreateProcess вместо ShellExecute. CreateProcess предоставит вам дескрипторы, необходимые для завершения процесса и проверки его статуса выхода.

Смежные вопросы