- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在获得 CreateProcess 返回的句柄后,我调用 TerminateProcess,为进程退出代码传递 42。然后,我使用 WaitForSingleObject 终止进程,最后调用 GetExitCodeProcess。
函数调用均未报告错误。子进程是一个无限循环,不会自行终止。
问题是,有时 GetExitCodeProcess 返回 42 作为退出代码(它应该如此),有时返回 0。知道为什么吗?
#include <string>
#include <sstream>
#include <iostream>
#include <assert.h>
#include <windows.h>
void check_call( bool result, char const * call );
#define CHECK_CALL(call) check_call(call,#call);
int
main( int argc, char const * argv[] )
{
if( argc>1 )
{
assert( !strcmp(argv[1],"inf") );
for(;;)
{
}
}
int err=0;
for( int i=0; i!=200; ++i )
{
STARTUPINFO sinfo;
ZeroMemory(&sinfo,sizeof(STARTUPINFO));
sinfo.cb=sizeof(STARTUPINFO);
PROCESS_INFORMATION pe;
char cmd_line[32768];
strcat(strcpy(cmd_line,argv[0])," inf");
CHECK_CALL((CreateProcess(0,cmd_line,0,0,TRUE,0,0,0,&sinfo,&pe)!=0));
CHECK_CALL((CloseHandle(pe.hThread)!=0));
CHECK_CALL((TerminateProcess(pe.hProcess,42)!=0));
CHECK_CALL((WaitForSingleObject(pe.hProcess,INFINITE)==WAIT_OBJECT_0));
DWORD ec=0;
CHECK_CALL((GetExitCodeProcess(pe.hProcess,&ec)!=0));
CHECK_CALL((CloseHandle(pe.hProcess)!=0));
err += (ec!=42);
}
std::cout << err;
return 0;
}
std::string
get_last_error_str( DWORD err )
{
std::ostringstream s;
s << err;
LPVOID lpMsgBuf=0;
if( FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
0,
err,
MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
(LPSTR)&lpMsgBuf,
0,
0) )
{
assert(lpMsgBuf!=0);
std::string msg;
try
{
std::string((LPCSTR)lpMsgBuf).swap(msg);
}
catch(
... )
{
}
LocalFree(lpMsgBuf);
if( !msg.empty() && msg[msg.size()-1]=='\n' )
msg.resize(msg.size()-1);
if( !msg.empty() && msg[msg.size()-1]=='\r' )
msg.resize(msg.size()-1);
s << ", \"" << msg << '"';
}
return s.str();
}
void
check_call( bool result, char const * call )
{
assert(call && *call);
if( !result )
{
std::cerr << call << " failed.\nGetLastError:" << get_last_error_str(GetLastError()) << std::endl;
exit(2);
}
}
最佳答案
我认为 nobugz 的评论已经解决了这个问题......
但这是另一个大胆的猜测 - 也许您调用 TerminateProcess()
的时间太晚了很快,并且 Windows 没有完全序列化指定的设置进程错误代码通过 TerminateProcess()
以及它在进程初始化时可能尝试做的任何事情?我认为这不太可能,但可能值得将 Seth suggested 放入 Sleep(1)
调用中(甚至 Sleep(0)
)调用以查看行为是否发生变化。
此外,您可能需要考虑发布一些人们可以试验的代码。
关于c - 42 传递给 TerminateProcess,有时 GetExitCodeProcess 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2061735/
我一直在搜索 Win32 API C++ 函数的示例 TerminateProcess()但找不到。 一般来说,我对 Win32 API 不是很熟悉,所以我想问问这里是否有比我更擅长的人可以给我举个例
Windows 中的 TerminateProcess 函数真的会因为进程内的线程陷入死锁而挂起吗? 示例:进程 A 在进程 B 的控制下运行,现在进程 A 进入死锁状态,进程 B 检测到这一点并决定
我正在尝试使用 TerminateProcess 来终止由 ShellExecuteEX 启动的应用程序,如下所示: SHELLEXECUTEINFO ExecuteInfo; ExecuteInfo
我有一个备份应用程序,它将在备份之前关闭用户定义的正在运行的程序,以便可以在备份之前关闭并刷新打开的数据文件。备份完成后,它将重新启动列表中的程序。 我使用 Caption 和 PostMessage
我正在尝试使用下面的代码终止一组进程,但只有少数进程被终止,因此请建议我更好的方法来终止所有进程。 hProc = OpenProcess( PROCESS_TERMINATE, FALSE, pro
我在使用 TerminateProcess 终止子进程时遇到问题。我调用了这个函数,进程仍然存在(在任务管理器中)。这段代码被多次调用,多次启动相同的 program.exe,这些进程在任务管理器中,
我遇到了 TerminateProcess() 函数的问题。该应用程序我目前正在编写一个 JobScheduler 应用程序,它可以在特定时间安排和启 Action 业。为此,我使用 CreatePr
我的 Win32 控制台应用程序使用第三方库。在它退出 WinMain 全局对象后,破坏开始并且 AV 发生在内部深处的某个地方。我真的很想写 TerminateProcess( GetCurrent
我正在开发应该终止具有给定名称的进程的应用程序。我使用的操作系统是 Windows 7。问题是,对于任务管理器中列出的所有具有非空白用户名字段的进程,它工作正常。但是,当一个进程的用户名为空时,即使任
我正在尝试调试一个问题,但我不明白。 func BackgroundProcess(lpCommandLine string) (error) { var lpProcessAttrs win
TerminateProcess 的文档部分说: This function stops execution of all threads within the process and request
我有一个使用 SQLite3 维护数据库文件的控制台模式程序。执行需要一段时间,但假设数据库写入发生,在任何时候取消都应该是安全的。 (这都是Windows下的) 从正在运行的程序的角度来看,在控制台
免责声明:这是程序要求的一部分,因此没有任何不良意义。如果您发现任何误用,请随时指出。我是 C++ 的初学者。 基本上,我正在尝试使用 C++ 在 Windows 上重新启动 Outlook.exe。
在获得 CreateProcess 返回的句柄后,我调用 TerminateProcess,为进程退出代码传递 42。然后,我使用 WaitForSingleObject 终止进程,最后调用 GetE
我正在寻找一种简单且难以捉摸的方法来终止我的 C++ 应用程序的 Mac 端口。在我使用的 Windows 中 TerminateProcess(GetCurrentProcess, 0); 我可以在
在 Linux/POSIX 上相当于什么 TerminateProcess(GetCurrentProcess(), 0) 我希望能够突然、无序地终止程序,无论我是否在线程中。我不关心析构函数、退出处
我正在使用“TerminateProcess (procHandle, 0)”来终止线程。它适用于大多数线程,但它无法杀死某些线程。为什么?而且任务管理器也无法终止这些线程。 有没有办法强制杀死任何线
我使用 CreateProcess() 函数通过“mstsc.exe”启动 rdp 客户端应用程序。之后,我想终止它,所以我使用了 TerminateProcess() 函数,但它失败了,错误代码为
请看下面的代码: LPSTR commandBuffer = "\"C:\\Program Files (x86)\\Notepad++\\notepad++.exe\""; STARTUPINFO
我是一名优秀的程序员,十分优秀!