我有一个用c#编写的.net应用程序。从使用c ++编写的父应用程序调用此应用程序。当父应用程序崩溃或意外关闭时,.net应用程序仍然运行。但是,当父应用程序崩溃或停止时,我也希望关闭客户端应用程序。
我的一位同事说我们可以使用单例类轻松实现这一点。我怎么能这样做?
答案 0 :(得分:1)
您将不得不轮询以查看父应用程序是否仍在运行。
执行此操作的一种方法是通过在Windows中配置审核进程跟踪来设置运行应用程序的时间。以下链接可以帮助您入门:
进程跟踪将在Windows事件日志中创建条目,然后您可以使用C ++,C#和/或VB.Net进行访问。您可以使用这些日志来查看Parent应用程序是否正在运行。
编辑:
如果您有权访问C ++代码库,您可以尝试在父应用程序崩溃或关闭时捕获异常,例如:
Application.ThreadException += new ThreadExceptionEventHandler(ApplicationThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ApplicationUnhandledException);
private void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
//Write to a File, Registry, Database flagging the application has crashed
}
private void ApplicationUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
//Write to a File, Registry, Database flagging the application has crashed
}
private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
//Write to a File, Registry, Database flagging the application has closed
}
否则,您必须进行轮询以查看是否在流程管理器中列出了父应用程序,例如:
StringBuilder sb = new StringBuilder();
ManagementClass MgmtClass = new ManagementClass("Win32_Process");
foreach (ManagementObject mo in MgmtClass.GetInstances())
{
sb.Append("Name:\t" + mo["Name"] + Environment.NewLine);
sb.Append("ID:\t" + mo["ProcessId"] + Environment.NewLine);
sb.Append(Environment.NewLine);
}
如果未列出,请关闭子应用程序。
答案 1 :(得分:0)
首先,当父窗口引发异常或关闭时,您必须捕获事件。 其次,您将发送关闭已通过父窗口启动的进程的消息。 有关发送关闭消息的信息,请参考此处: Send message to a Windows process (not its main window)
或