我需要重新启动我在下载更新后正在处理的程序,但我遇到了一些问题。
如果我使用CreateProcess没有任何反应,如果我使用ShellExecute我得到一个0xC0150002错误,如果我使用命令“runas”使用ShellExecute它工作正常。我可以使用CreateProcess和ShellExecute启动命令提示符,只是不再使用相同的exe并且不想使用runas,因为这会提升exe。
任何想法?
Windows 7,visual studio 2008 c ++
alt text http://lodle.net/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);
答案 0 :(得分:2)
CreateProcess()是一个神秘的野兽。我毫不在意地记得我对它的第一次失望。您应该查看Microsoft CreateProcess Example和CreateProcess 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个要检查,不要偷懒: - )
我提交的另一个错误是在完成后没有关闭PROCESS_INFORMATION中的hProcess和/或hThread句柄返回。我确实做了hProcess,但没有做hThread。
答案 1 :(得分:1)
看起来像是从错误代码判断的清单或注册表问题。如果您无法获取实际的错误消息字符串以获取更多详细信息,则可以尝试:
答案 2 :(得分:1)
如果使用system()运行进程会发生什么?它可以减少您的控制,但是您将从正在运行的相同上下文中运行它。另外,尝试使用ProcMon监视第二个进程的启动,它可能会为您提供有关失败源的所需提示
答案 3 :(得分:0)
好吧最后全力以赴。
我的第一次运行它时使用了默认路径,并且从默认路径中加载了vld(检漏仪dll)。但是在exe中我将dll路径修改为bin文件夹([app] \ bin)当我使用CreateProcess重新启动exe时,它拾取了不同的vld dll(这是我的错误),它具有错误的并排链接和只有在看完事件查看器之后才能解决它。
感谢您的帮助。