gpt4 book ai didi

c++ - 麻烦重启exe

转载 作者:可可西里 更新时间:2023-11-01 10:02:07 25 4
gpt4 key购买 nike

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

如果我使用 CreateProcess,什么也不会发生,如果我使用 ShellExecute,我会收到 0xC0150002 错误,如果我将 ShellExecute 与命令“runas”一起使用,它工作正常。我可以使用 CreateProcess 和 ShellExecute 启动命令提示符,只是再次使用不同的 exe,并且不想使用 runas,因为这会提升 exe。

有什么想法吗?

Windows 7、visual studio 2008 c++

alt text http://lodle.net/shell_error.jpg

创建进程:

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

外壳执行:

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 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。

关于c++ - 麻烦重启exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1112840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com