Как перезапустить консоль c приложением, написанным в windows? - PullRequest
3 голосов
/ 18 ноября 2010

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

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

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

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

Спасибо

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

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

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

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

0 голосов
/ 06 декабря 2010

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

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

startUpInfo.cb = sizeof (startUpInfo);

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

WaitForSingleObject (procInfo.hProcess, INFINITE);
}

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

0 голосов
/ 18 ноября 2010

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

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

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

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

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

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

и т.д.

Надеюсь, это вам поможет!

...