在 64 bin 机器中调用 32 bin 应用程序时,TerminateProcess() 失败
TerminateProcess() Fails when called upon a 32 bin application in a 64 bin machine
请通过以下代码:
LPSTR commandBuffer = "\"C:\Program Files (x86)\Notepad++\notepad++.exe\"";
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_MINIMIZE;
if (CreateProcess(NULL,
commandBuffer,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi)) {
Sleep(5000);
UINT exitCode = 0;
if (!TerminateProcess(pi.hProcess, exitCode))
std::cout << GetLastError() << std::endl;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
在这里,当我在 64 bin Windows 7 机器上使用 32 bin 应用程序 (Notepad++.exe) 创建进程时 TerminateProcess()
失败,错误代码为 5(访问被拒绝),但是如果我创建一个在同一台机器上处理 64 位应用程序(即 LPSTR commandBuffer = "\"C:\Program Files\depends22_x64\depends.exe\""
)没有错误。我需要了解为什么会发生这种情况,以及如何才能正确终止在 64 位 Windows 7 机器上使用 32 位应用程序创建的进程。
此代码错误:
if (TerminateProcess(pi.hProcess, exitCode))
std::cout << GetLastError() << std::endl;
TerminateProcess returns 0 表示失败,非 0 代码表示成功。 C++ if() 语句将非零值评估为真,将零评估为假。所以,你需要写:
if (TerminateProcess(pi.hProcess, exitCode) == 0)
std::cout << GetLastError() << std::endl;
至于实际问题。我无法在 Windows 10 64 位上重现它,但如果它仍然存在,请尝试以下操作:
不使用从 CreateProcess()
返回的进程句柄,而是使用 OpenHandle()
创建一个新句柄,并在从 CreateProcess()
返回的进程 ID 上明确指定 PROCESS_TERMINATE
。然后使用该句柄使用 ProcessTerminate()
.
终止进程
您还需要考虑的是,像 notepad++ 这样的应用程序在已经 运行 时会自动终止,而是激活已经 运行 的进程,也许会告诉已经 运行例如打开文件或类似文件。在这种情况下,终止创建的进程对之前已经 运行 的进程没有影响。
请通过以下代码:
LPSTR commandBuffer = "\"C:\Program Files (x86)\Notepad++\notepad++.exe\"";
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_MINIMIZE;
if (CreateProcess(NULL,
commandBuffer,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi)) {
Sleep(5000);
UINT exitCode = 0;
if (!TerminateProcess(pi.hProcess, exitCode))
std::cout << GetLastError() << std::endl;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
在这里,当我在 64 bin Windows 7 机器上使用 32 bin 应用程序 (Notepad++.exe) 创建进程时 TerminateProcess()
失败,错误代码为 5(访问被拒绝),但是如果我创建一个在同一台机器上处理 64 位应用程序(即 LPSTR commandBuffer = "\"C:\Program Files\depends22_x64\depends.exe\""
)没有错误。我需要了解为什么会发生这种情况,以及如何才能正确终止在 64 位 Windows 7 机器上使用 32 位应用程序创建的进程。
此代码错误:
if (TerminateProcess(pi.hProcess, exitCode))
std::cout << GetLastError() << std::endl;
TerminateProcess returns 0 表示失败,非 0 代码表示成功。 C++ if() 语句将非零值评估为真,将零评估为假。所以,你需要写:
if (TerminateProcess(pi.hProcess, exitCode) == 0)
std::cout << GetLastError() << std::endl;
至于实际问题。我无法在 Windows 10 64 位上重现它,但如果它仍然存在,请尝试以下操作:
不使用从 CreateProcess()
返回的进程句柄,而是使用 OpenHandle()
创建一个新句柄,并在从 CreateProcess()
返回的进程 ID 上明确指定 PROCESS_TERMINATE
。然后使用该句柄使用 ProcessTerminate()
.
您还需要考虑的是,像 notepad++ 这样的应用程序在已经 运行 时会自动终止,而是激活已经 运行 的进程,也许会告诉已经 运行例如打开文件或类似文件。在这种情况下,终止创建的进程对之前已经 运行 的进程没有影响。