Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法重新启动exe_C++_Windows - Fatal编程技术网

C++ 无法重新启动exe

C++ 无法重新启动exe,c++,windows,C++,Windows,我需要重新启动程序,我的工作后,更新已被下载,除了我运行到一些问题 如果我使用CreateProcess,什么都不会发生,如果我使用ShellExecute,我会得到一个0xC0150002错误,如果我使用ShellExecute和命令“runas”,它工作正常。我可以使用CreateProcess和ShellExecute再次启动命令提示符,但不想使用runas,因为这会提升exe 有什么想法吗 Windows7,VisualStudio2008C++ CreateProcess: char

我需要重新启动程序,我的工作后,更新已被下载,除了我运行到一些问题

如果我使用CreateProcess,什么都不会发生,如果我使用ShellExecute,我会得到一个0xC0150002错误,如果我使用ShellExecute和命令“runas”,它工作正常。我可以使用CreateProcess和ShellExecute再次启动命令提示符,但不想使用runas,因为这会提升exe

有什么想法吗

Windows7,VisualStudio2008C++

CreateProcess:

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 );
ShellExecute:

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);

从错误代码判断,似乎是清单或注册表问题。如果无法获取实际错误消息字符串以了解更多详细信息,您可以尝试:

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

如果使用system()运行进程,会发生什么情况?它给你更少的控制,但是你将从你正在运行的同一个上下文中运行它。另外,尝试使用ProcMon监视第二个进程的启动,它可能会为您提供所需的有关失败源的提示。

CreateProcess()是一个神秘的野兽。我毫不犹豫地记得我第一次对它的挫折。你应该看看和。(这些链接的生命周期可能很短,谷歌的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句柄返回进程\信息。我确实做了HProces,但没有做hThread。

Ok最终解决了所有问题

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


感谢您的帮助。

问题是exe本身运行正常,只有在尝试重新启动时才会出现此问题。如果是清单问题,您可以使用事件查看器来跟踪它。然后,如果这没有帮助,如果需要更多信息,请从命令行运行sxstrace。(在不带参数的情况下运行一次以查看其用法)但我觉得这不是清单问题。只是检查了事件日志,似乎其中一个调试DLL出现了并行错误。奇怪的是,它正常工作正常。应该说CreateProcess返回1,这意味着一切正常。