无法重新启动exe

时间:2009-07-11 03:17:18

标签: c++ windows

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

如果我使用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);

4 个答案:

答案 0 :(得分:2)

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个要检查,不要偷懒: - )

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

答案 1 :(得分:1)

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

  • 将每个可能的清单文件(Microsoft.VC80.CRT.manifest等)移动到您的exe目录中,以确保可访问性
  • 干净地完全卸载/删除旧版本的DLL,你可能有安装程序的新版本(我建议:卸载每个版本,使用清扫工具清理注册表,如Norton的,从头开始重新安装新的东西)< / LI>

答案 2 :(得分:1)

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

答案 3 :(得分:0)

好吧最后全力以赴。

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

感谢您的帮助。