【问题标题】:Trouble restarting exe无法重启exe
【发布时间】:2009-07-11 16:08:22
【问题描述】:

我需要在下载更新后重新启动我正在处理的程序,除非我遇到了一些问题。

如果我使用 CreateProcess 没有任何反应,如果我使用 ShellExecute 我会收到 0xC0150002 错误,如果我使用带有命令“runas”的 ShellExecute 它工作正常。我可以使用 CreateProcess 和 ShellExecute 很好地启动命令提示符,只是再次使用不同的 exe,并且不想使用 runas,因为这会提升 exe。

有什么想法吗?

Windows 7、Visual Studio 2008 C++

alt text http://lodle.net/shell_error.jpg

创建过程:

char exePath[255];
GetModuleFileName(NULL, exePath, 255);

size_t exePathLen = strlen(exePath);
for (size_t x=exePathLen; x>0; x--)
{
    if (exePath[x] == '\\')
        break;
    else
        exePath[x] = '\0';
}


char name[255];
GetModuleFileName(NULL, name, 255);

PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartupInfo = {0};

BOOL res = CreateProcess(name, "-wait", NULL, NULL, false, 0, NULL, exePath, &StartupInfo, &ProcInfo );

Shell 执行:

char exePath[255];
GetModuleFileName(NULL, exePath, 255);

size_t exePathLen = strlen(exePath);
for (size_t x=exePathLen; x>0; x--)
{
    if (exePath[x] == '\\')
        break;
    else
        exePath[x] = '\0';
}

char name[255];
GetModuleFileName(NULL, name, 255);

INT_PTR r = (INT_PTR)ShellExecute(NULL, "runas", name, "-wait", exePath, SW_SHOW);

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

    CreateProcess() 是一个神秘的野兽。我不怀好意地记得我对它的第一次挫败感。您应该查看Microsoft CreateProcess ExampleCreateProcess Page。 (这些链接的生命周期可能很短,谷歌搜索 CreateProcess 应该也能正常工作)。

    我可以在您的代码中看到 3 个问题。

    StartupInfo 必须将“cb”设置为结构大小:

    STARTUPINFO StartupInfo = {0};
    StartupInfo.cb = sizeof(StartupInfo);
    

    第二个参数需要命令和参数来形成命令行。您的程序会将“-wait”视为 argv[0] 并忽略它或不理会它。

    char command[512];
    sprintf(command, "%s -wait", name);
    BOOL res = CreateProcess(name, command, // and as you had before
    

    如果 CreateProcess() 失败(通过返回零),您不会查看 GetLastError()。它可能对您有所帮助,但我怀疑它只会说“无效的论点”之类的。嘿,只有 10 个要检查,不要偷懒:-)

    我提交的另一个错误是当我完成时没有关闭 hProcess 和/或 hThread 句柄在 PROCESS_INFORMATION 中返回。我确实做了 hProcess,但没有做 hThread。

    【讨论】:

    • 应该说 CreateProcess 返回 1,这意味着一切正常。
    【解决方案2】:

    从错误代码来看,看起来像是清单或注册表问题。如果您无法获取更多详细信息的实际错误消息字符串,您可以尝试:

    • 将所有可能的清单文件(Microsoft.VC80.CRT.manifest 等)移动到您的 exe 目录中,以确保可访问性
    • 干净彻底地卸载/清除旧版本的 DLL,您可能安装了较新版本的 DLL(我建议:卸载每个版本,使用 Norton 等清扫工具清理注册表,从头开始重新安装新内容)

    【讨论】:

    • 问题是exe自己运行良好,只有在尝试重新启动时才会出现此问题。
    • 如果它清单问题,您可以使用事件查看器进行跟踪。然后,如果这没有帮助,如果您需要更多信息,请从命令行运行 sxstrace。 (不带参数运行一次以查看其用法)但这对我来说似乎不是一个明显的问题。
    • 刚刚检查了事件日志,似乎其中一个调试 dll 出现并排错误。奇怪,因为它正常工作。
    【解决方案3】:

    如果使用 system() 运行进程会发生什么?它为您提供较少的控制,但您将在您运行的同一上下文中运行它。此外,尝试使用 ProcMon 监视您的第二个进程的启动,它可能会为您提供有关故障来源所需的提示.

    【讨论】:

      【解决方案4】:

      好的,最后都解决了。

      我的 exe 第一次运行时使用了默认路径,因此从默认路径加载了 vld(泄漏检测器 dll)。但是在 exe 中,当我使用 CreateProcess 重新启动 exe 时,我将 dll 路径修改为 bin 文件夹([app]\bin),它拾取了一个不同的 vld dll(这是我的错误),它具有不正确的并排链接和只有在查看事件查看器之后我才解决了这个问题。

      感谢您的所有帮助。

      【讨论】:

        猜你喜欢
        • 2020-08-06
        • 1970-01-01
        • 2019-05-29
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多