3

我正在使用 MSVS 2008。我正在用 c 编写一个应用程序,并且想知道在 Windows 中重新启动应用程序的最佳方法是什么。

我环顾四周,有人在做这样的事情,但我不确定这是否是最好的方法,或者这是否会创建一个全新的过程。

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

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

谢谢

4

3 回答 3

1

为此,您必须有一个额外的过程。

从您的应用程序中,您将启动该过程。它将等待您的主应用程序退出,然后等待它应该发生的任何事情(更新,...),然后重新启动它以杀死自己。

无法从内部启动应用程序,因为您将无法更新任何内容。

于 2010-12-06T09:34:35.883 回答
0

简短的回答:对我来说看起来不错,但是如果您绑定到套接字,那么您的两个程序在父 exit() 之前发生冲突的可能性非常小。

恐怕要求“最好”的方式会产生“它依赖于上下文”的回复之一。

首先,根据 WinExec 上的MSDN 文档,“此函数仅用于与 16 位 Windows 兼容。应用程序应使用 CreateProcess 函数”。这意味着它是一个 dos 时代的函数包装器,用于类似“ exec ”的函数。当然 CreateProcess 是某种只有 MS 才会创建的怪物,但如果这个应用程序非常重要,那么可能应该采纳建议。

有趣的是,MS 在 CreatProcess 的文档中提到“关闭进程的首选方法是使用 ExitProcess 函数”。

所以你可以看到,就像有这么多问题一样,有很多解决方案。可能会磨练这里的答复的要回答的问题是:

  • 你关心平台独立性吗?
  • 你关心安全吗?
  • 你关心这个程序需要付出多少努力吗?

等等

我希望这可以帮助你!

于 2010-11-17T23:04:17.490 回答
0

这是有关如何启动计算器的一些愚蠢示例。

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”。它将等待它终止,然后重新开始。请记住,我没有在这里关闭任何句柄!!!

于 2010-12-06T09:28:52.563 回答