C++ 无法重新启动exe
我需要重新启动程序,我的工作后,更新已被下载,除了我运行到一些问题 如果我使用CreateProcess,什么都不会发生,如果我使用ShellExecute,我会得到一个0xC0150002错误,如果我使用ShellExecute和命令“runas”,它工作正常。我可以使用CreateProcess和ShellExecute再次启动命令提示符,但不想使用runas,因为这会提升exe 有什么想法吗 Windows7,VisualStudio2008C++ CreateProcess:C++ 无法重新启动exe,c++,windows,C++,Windows,我需要重新启动程序,我的工作后,更新已被下载,除了我运行到一些问题 如果我使用CreateProcess,什么都不会发生,如果我使用ShellExecute,我会得到一个0xC0150002错误,如果我使用ShellExecute和命令“runas”,它工作正常。我可以使用CreateProcess和ShellExecute再次启动命令提示符,但不想使用runas,因为这会提升exe 有什么想法吗 Windows7,VisualStudio2008C++ CreateProcess: char
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之类的清理工具清理注册表,从头重新安装新内容)
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,这意味着一切正常。