如何让后台运行的程序结束。

aznarble 2001-11-09 12:54:23
在Win NT/2000中,有两个Win32程序A和B,其中A含有GUI,B无GUI在后台运行。A在运行时会呼出B,此时A的状态为挂起,直到B运行结束才会继续其他操作。
如果在B运行的过程中打开任务管理器,在进程列表中将A.exe结束任务,此时B仍然在运行。请问有没有什么简单的方法,能让B也同时结束?
...全文
390 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zj_ok 2001-11-09
  • 打赏
  • 举报
回复
那程序被强行关闭时,可以截到哪些事件
aznarble 2001-11-09
  • 打赏
  • 举报
回复
要是这么简单就好了。
void CProtestDlg::PostNcDestroy() 当主程序在进程列表被强行终止(不是应用程序窗口!)根本无法截到这个事件!
rosement 2001-11-09
  • 打赏
  • 举报
回复
这是个非常简单的问题,以下是实现的代码(一个小例子):
PROCESS_INFORMATION pi={0};

void CProtestDlg::OnButton1()
{
STARTUPINFO st={0};
st.cb=sizeof(STARTUPINFO);
st.lpReserved=NULL;
st.lpReserved2=NULL;
st.lpDesktop=NULL;
st.dwFlags=0;

if(!CreateProcess(NULL,
"NOTEPAD",
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&st,
&pi))
{
TRACE("%d",GetLastError());
}

}

void CProtestDlg::PostNcDestroy() /*只要你POSTNCDESTROY的WINDOWS事件中相应自己
的程序代码就可以完成程序在被强行关闭时,执行以下代码.*/
{
// TODO: Add your specialized code here and/or call the base class
UINT I;
TerminateProcess(pi.hProcess,I);
CDialog::PostNcDestroy();
}
aznarble 2001-11-09
  • 打赏
  • 举报
回复
现在我已经实现了一种解决方法,不过较复杂:

1 在B中创建一个新线程,在这个新线程中完成原来B的功能。
2 在B的主线程中等待新线程结束,如果新线程在运行,就定时查询调用B的进程(这里是进程A)的存在状态,如果查询失败,立刻终止正在运行的新线程,以特殊的返回值退出应用程序。
3 如果新线程正常结束,则B正常退出。

这个方法关键是要较大地改动B的结构,我的本意是能否尽量在不改动B的前提下完成同样的功能。
sclzmbie 2001-11-09
  • 打赏
  • 举报
回复
基本上你杀掉进程的话,绝对没有办法通知到B的。你只有杀两次。上面两位说的都是在A正常退出的情况下可以控制B的行为。
kingzai 2001-11-09
  • 打赏
  • 举报
回复
可以用::SendMessgage和::PostMessage完成两个进程之间的通讯,但它们只能传送两个32位的值,不过传变量应该够了。如果用内存映射文件实现两个进程通讯无疑太复杂。
ky640 2001-11-09
  • 打赏
  • 举报
回复
只不过是一个简单的进程间通信问题。可设一共享变量,A退出时将变量赋值,B采用轮询的方式运行

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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