如何让程序知道自己正在被任务管理器关闭? 任务管理器关闭程序的时候会通知该程序吗?还有程序非正常退出时,要是还想执行一些代码应该在哪里写? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 挂接API:TerminateProcess,ExitProcess 是Hook这两个函数吗?还有没有其他方法,比如说异常处理? 在APP的下面函数:int CRwefwertwertApp::ExitInstance() { // TODO: Add your specialized code here and/or call the base class MessageBox( NULL , "这里就可以知道" , "这里就可以知道" , 0 ); return CWinApp::ExitInstance();} To QunKangLi(雾痕),冤啊~~~~~!我不是想做木马,不要冤枉我啊!!^_^而是我的程序中为了不会同时开启两个以上实例,自己用了GlobalAddAtom等一类函数,正常退出时我再调用GlobalDeleteAtom就可以了。可是如果程序非正常关闭,那个Atom就会留在内存当中,导致再想重新启动程序就会失败。很是郁闷。所以想问问有没有办法解决这个问题?To ChangeMyHead(改头换面),你这个方法在正常退出时可以,但我是要非正常退出时也处理。不信你把这个程序用任务管理器结束一下试试,不会弹出对话框的。 QunKangLi(雾痕)来帮帮忙啊!大家都来帮帮忙啊! //取进程中是否有你要的,如果遍历所有的进程没有找到,那么你的程序就被关闭了 DWORD aProcesses[ 1024 ]; DWORD cProcesses = GetProcessIDs( aProcesses, sizeof( aProcesses ) ); DWORD idxList = 0; //遍历所有的进程 for( DWORD idx = 0; idx < cProcesses; idx++ ) { //返回进程的名称 CString sName = GetProcessBaseModuleName( aProcesses[ idx ] ); if (sName==你的程序) ...... }///////////////////////////////////////////////////////////////////////////////列举所有的进程//BOOL WINAPI EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD * cbNeeded);//DWORD * lpidProcess,//指针指向存放进程ID的数组//DWORD cb, //数组大小//DWORD * cbNeeded //返回的实际大小DWORD GetProcessIDs( DWORD* pdwBuffer, DWORD dwSizeBuffer ){ DWORD cbNeeded = 0; if( !EnumProcesses( pdwBuffer, dwSizeBuffer, &cbNeeded ) ) { ASSERT( FALSE ); return( 0 ); } return( cbNeeded / sizeof( DWORD ) );} 用命名事件或其它的命名内核对象来实现进程的唯一性最好办.程序初使化时检查同名对象是否存在就行,如果是信号量对象,还可以人为设置允许的进程数.以事件为例:#define EXIST_EVENT_NAME "IsMyProcessExist"BOOL CYourMainApp::InitInstance() HANDLE hExist ; hExist = CreateEvent( NULL, TRUE, FALSE, _T(EXIST_EVENT_NAME) ) ; if( NULL == hExist )//异常... return FALSE ; if( ERROR_ALREADY_EXISTS == GetLastError() )//已经有一个进程在运行 return FALSE ; COM组件跨进程传递STRUCT的问题 做外挂的思路 和女朋友在一起半年了,她的生日快到了,我该送些或者做些什么让她能够感动的? 关于图的搜索算法 关于异步的wsprecv的问题 动态修改程序的程序应该怎么写? 如何控制调用运行Dos程序的进度? 求助 原来的汇编专栏去哪了?没办法,借这个地方一用吧。 open inventor 关于进程间消息传递的问题。 求一函数,能实现BitBlt函数的所有功能,贴图模式只要SRCCOPY就行了!
{
// TODO: Add your specialized code here and/or call the base class
MessageBox( NULL , "这里就可以知道" , "这里就可以知道" , 0 );
return CWinApp::ExitInstance();
}
冤啊~~~~~!
我不是想做木马,不要冤枉我啊!!^_^而是我的程序中为了不会同时开启两个以上实例,自己用了GlobalAddAtom等一类函数,正常退出时我再调用GlobalDeleteAtom就可以了。可是如果程序非正常关闭,那个Atom就会留在内存当中,导致再想重新启动程序就会失败。很是郁闷。所以想问问有没有办法解决这个问题?To ChangeMyHead(改头换面),
你这个方法在正常退出时可以,但我是要非正常退出时也处理。不信你把这个程序用任务管理器结束一下试试,不会弹出对话框的。
DWORD aProcesses[ 1024 ];
DWORD cProcesses = GetProcessIDs( aProcesses, sizeof( aProcesses ) ); DWORD idxList = 0; //遍历所有的进程
for( DWORD idx = 0; idx < cProcesses; idx++ )
{
//返回进程的名称
CString sName = GetProcessBaseModuleName( aProcesses[ idx ] );
if (sName==你的程序)
......
}
/////////////////////////////////////////////////////////////////////////////
//列举所有的进程
//BOOL WINAPI EnumProcesses(DWORD * lpidProcess, DWORD cb, DWORD * cbNeeded);
//DWORD * lpidProcess,//指针指向存放进程ID的数组
//DWORD cb, //数组大小
//DWORD * cbNeeded //返回的实际大小
DWORD GetProcessIDs( DWORD* pdwBuffer, DWORD dwSizeBuffer )
{
DWORD cbNeeded = 0; if( !EnumProcesses( pdwBuffer, dwSizeBuffer, &cbNeeded ) )
{
ASSERT( FALSE );
return( 0 );
}
return( cbNeeded / sizeof( DWORD ) );
}
程序初使化时检查同名对象是否存在就行,如果是信号量对象,还可以人为设置允许的进程数.
以事件为例:
#define EXIST_EVENT_NAME "IsMyProcessExist"
BOOL CYourMainApp::InitInstance()
HANDLE hExist ;
hExist = CreateEvent(
NULL, TRUE, FALSE, _T(EXIST_EVENT_NAME) ) ;
if( NULL == hExist )//异常...
return FALSE ;
if( ERROR_ALREADY_EXISTS == GetLastError() )//已经有一个进程在运行
return FALSE ;