我需要重新启动程序,即时通讯工作后,更新已被下载,除了我遇到一些问题。
如果我使用CreateProcess什么也没有发生,如果我使用ShellExecute我得到一个0xC0150002错误,如果我使用命令“runas”ShellExecute它工作正常。 我可以使用CreateProcess和ShellExecute再次启动命令提示符,只是不再是相同的exe文件,并不想使用runas,因为这将提升exe文件。
有任何想法吗?
Windows 7,Visual Studio 2008 c ++
替代文字http://img.zgserver.com/c%2B%2B/shell_error.jpg
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);
CreateProcess()是一个神秘的野兽。 我记得自己第一次遇到挫折。 您应该看看Microsoft CreateProcess示例和CreateProcess页面 。 (这些链接可能有一个短的生命周期,Googling CreateProcess也应该工作)。
我可以在代码中看到3个问题。
StartupInfo必须将“cb”设置为结构大小:
STARTUPINFO StartupInfo = {0}; StartupInfo.cb = sizeof(StartupInfo);
第二个参数需要命令和参数组成命令行。 你的程序会看到“等待”为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。
看起来像从错误代码判断的清单或注册表问题。 如果您无法获取更多详细信息的实际错误消息字符串,则可以尝试:
如果使用system()运行进程会发生什么? 它可以减少对你的控制,但是你可以从运行的环境中运行它。另外,尝试使用ProcMon来监视你的第二个进程的启动,它可能会给你提示你需要关于失败的来源。
好吧,最后全部工作。
第一次我的EXE运行它使用默认路径,并像默认路径加载VLD(一个泄漏检测DLL)。 然而,在exe中,我修改了DLL路径为bin文件夹([app] \ bin),当我使用CreateProcess重新启动exe文件时,它拾起了一个不同的vld dll(这是我的错误)只是在看事件查看器后,我才解决了这个问题。
感谢你的帮助。