如何杀死,并重新启动一个进程

huanmeng2008 2010-03-11 11:40:56
我现在有一个基于对话框的程序a.exe,里面有个注销的功能,我想点击注销的时候 杀死自身,然后在重新启动这个程序。请问大虾们该如何实现,调用哪些API。
...全文
712 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由建客 2010-03-13
  • 打赏
  • 举报
回复
Windows就是麻烦
hzy694358 2010-03-11
  • 打赏
  • 举报
回复
就是所谓的守护进程
sjdev 2010-03-11
  • 打赏
  • 举报
回复
关闭时启动一批处理,在批处理中启动程序.

如果时间太紧,批处理中可以设置延时.
这不是鸭头 2010-03-11
  • 打赏
  • 举报
回复
很多都是借助另外的一个程序来实现
bilaopao 2010-03-11
  • 打赏
  • 举报
回复
在a.exe启动之后启动另一个进程monitor.exe来辅助实现此功能。
当a.exe退出时发送参数到monitor.exe告知“我已经退出了,你再启动我吧”
monitor.exe接受到命令后用findwindow来看之前的a.exe是否已经消失了。
然后再启动a.exe .

只是给个思路,里面还有一些地方要注意,但是肯定行得通。
cpp2017 2010-03-11
  • 打赏
  • 举报
回复
如果不借助另一个程序的话,必须先启动,再退出自己。
那么在一个短时间内,该程序会运行两个实例。如果运行两个程序有问题的话,得借助另一个程序来做。
ljz888666555 2010-03-11
  • 打赏
  • 举报
回复
你可以先启动,再杀死。
CreateProcess
TerminateProcess
WizardK 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 huanmeng2008 的回复:]
引用 27 楼 wizardk 的回复:
引用 26 楼 huanmeng2008 的回复:
to WizardK:
多开 就向你用5个QQ号同时开5个QQ ,这个时候你只是要注销其中的一个号码为88888的QQ, 其他正常运行。


我晕了。。。你5个进程,要关闭一个,然后呢?这个和你所说的关闭并开启一个进程有什么关系?


关闭一个后自动在重启一个啊!!!!!
[/Quote]

那你就CREATEPROCESS后退出
mszjk 2010-03-11
  • 打赏
  • 举报
回复
进程是用PID唯一标识的吧?
多开不多开没什么关系吧?
有没有好办法啊~~~
huanmeng2008 2010-03-11
  • 打赏
  • 举报
回复
写了个测试例子 貌似可以用,不知道会不会有其他什么问题,大家帮忙看看。

在BOOL CtestApp::InitInstance()里添加
CString strParam = GetCommandLine();
AfxMessageBox(strParam);
int idx = strParam.ReverseFind('\"');
if ( idx > 0)
{
CString strID = strParam.Mid(idx+2);
if ( !strID.IsEmpty() )
{
AfxMessageBox(strID);
DWORD dwProcessID = atoi((LPCSTR)strID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
TerminateProcess(handle,0);
}
}
Button1为注销按钮:
void CtestDlg::OnBnClickedButton1()
{
DWORD dwProcessID=0;
GetWindowThreadProcessId(m_hWnd, &dwProcessID);

char buf[MAX_PATH+1];
memset(buf, 0, sizeof(buf));
::GetModuleFileName(NULL, buf, MAX_PATH);

/// 把进程ID 当成参数传给下个进程,由启动的进程关闭这个进程
CString path;
path.Format("%s %d",buf, dwProcessID);

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

if( !CreateProcess( NULL, (LPSTR)(LPCSTR)path,NULL,NULL, FALSE, 0, NULL, NULL, &si, &pi ) )
{
return;
}

}
a5796489 2010-03-11
  • 打赏
  • 举报
回复
楼主在14楼的要求的看法:
你要新建一个进程然后通过原进程的PID去关闭原进程何必要通过原进程向新进程传递pid呢,直接在新进程里用FindWindow或其它函数来获取不就行了么?如果一定要通过原进程传给新进程的话,可以考虑用全局原子来实现
huanmeng2008 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 wizardk 的回复:]
引用 26 楼 huanmeng2008 的回复:
to WizardK:
多开 就向你用5个QQ号同时开5个QQ ,这个时候你只是要注销其中的一个号码为88888的QQ, 其他正常运行。


我晕了。。。你5个进程,要关闭一个,然后呢?这个和你所说的关闭并开启一个进程有什么关系?
[/Quote]

关闭一个后自动在重启一个啊!!!!!
zklovehh 2010-03-11
  • 打赏
  • 举报
回复
学习了......................
WizardK 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 huanmeng2008 的回复:]
to WizardK:
多开 就向你用5个QQ号同时开5个QQ ,这个时候你只是要注销其中的一个号码为88888的QQ, 其他正常运行。
[/Quote]

我晕了。。。你5个进程,要关闭一个,然后呢?这个和你所说的关闭并开启一个进程有什么关系?
huanmeng2008 2010-03-11
  • 打赏
  • 举报
回复
to WizardK:
多开 就向你用5个QQ号同时开5个QQ ,这个时候你只是要注销其中的一个号码为88888的QQ, 其他正常运行。
huanmeng2008 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 cpp2017 的回复:]
这个会不会导致一种情况,退出比较慢的话 退出界面还没销毁掉,另启动的那个进程界面已经弹出来。
=====>
会有这个情况,如果只是担心两个界面并存的话,可以先隐藏这个注销的窗口,然后开新进程,旧进程退出。


[/Quote]

因为我的主对话框上一些按钮还可以弹出一些子对话框, 这样我不是要一个个判断这些子对话框,然后在一个个隐藏。这样太麻烦了。
WizardK 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 huanmeng2008 的回复:]
引用 19 楼 cpp2017 的回复:
我是想只关掉注销的那一个
==》
那就按正常的来,先启动一个进程,再自己正常退出。一点问题都没有。


这个会不会导致一种情况,退出比较慢的话 退出界面还没销毁掉,另启动的那个进程界面已经弹出来。

to WizardK:
有需求啊, 我这程序支持多开啊
[/Quote]

啥叫多开啊?你如果“同时”开启多个进程,需要最后一个开启的进程把前面的都关闭?

我先问下,你怎么同时开启的?是否可以用单位时间内不允许同名进程开启来解决?
zhou1xp 2010-03-11
  • 打赏
  • 举报
回复
关闭的时候开新进程来启动
cpp2017 2010-03-11
  • 打赏
  • 举报
回复
这个会不会导致一种情况,退出比较慢的话 退出界面还没销毁掉,另启动的那个进程界面已经弹出来。
=====>
会有这个情况,如果只是担心两个界面并存的话,可以先隐藏这个注销的窗口,然后开新进程,旧进程退出。

huanmeng2008 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 cpp2017 的回复:]
我是想只关掉注销的那一个
==》
那就按正常的来,先启动一个进程,再自己正常退出。一点问题都没有。

[/Quote]
这个会不会导致一种情况,退出比较慢的话 退出界面还没销毁掉,另启动的那个进程界面已经弹出来。

to WizardK:
有需求啊, 我这程序支持多开啊
加载更多回复(14)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧