Как перезапустить консоль c приложением, написанным в windows?

Я использую MSVS 2008. Я пишу приложение на языке c и хотел бы знать, как лучше всего перезапустить приложение в Windows.

Я огляделся вокруг, и кто-то делал что-то подобное, но я не уверен, что это лучший способ, или это даже создает совершенно новый процесс.

    if(command == restart)
    {
        printf("program exiting!\n");
        Sleep(2000);
        system("cls");

        WinExec("my_app.exe", SW_SHOW);
        exit(0);
    }

Спасибо

3 ответа

Для этого вам понадобится один дополнительный процесс.

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

Запуск приложения изнутри сам по себе не будет нормальным, так как вы не сможете ничего обновить.

Вот несколько глупых примеров того, как запустить калькулятор.

STARTUPINFO startUpInfo = {0};
PROCESS_INFORMATION procInfo = {0};

startUpInfo.cb = sizeof (startUpInfo);

пока (1)
{
CreateProcess (L "C: \ windows \ System32 \ calc.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, & startUpInfo, & procInfo);

WaitForSingleObject (procInfo.hProcess, INFINITE);
}

Как видите, это запустит новый процесс "calc.exe". Он будет ждать, пока он не прекратит работу, и начнет все заново. Имейте в виду, что я не закрывал здесь никаких ручек!!!

Краткий ответ: мне кажется, что все в порядке, но если вы привязываетесь к сокетам, существует очень малая вероятность того, что ваши две программы могут столкнуться до родительского выхода ().

Боюсь, что запросить "лучший" способ - это дать один из этих "зависящих от контекста" ответов.

Для начала, в соответствии с документами MSDN на WinExec, "эта функция предоставляется только для совместимости с 16-битной Windows. Приложения должны использовать функцию CreateProcess". Это подразумевает, что это оболочка функции DOSA ERA для функции, подобной exec. Конечно, CreateProcess - это своего рода чудовище, которое может создать только MS, но если это приложение будет вообще важно, совет, вероятно, следует принять.

Интересно, что MS упоминает в документации по CreatProcess, что "предпочтительный способ завершить процесс - использовать функцию ExitProcess".

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

  • Вы заботитесь о независимости от платформы?
  • Вы заботитесь о безопасности?
  • Тебя не волнует, сколько усилий должна предпринять эта программа?

и т.п.

Я надеюсь, что это поможет вам!

Другие вопросы по тегам