Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Mobile 5-如何杀死其他应用程序?_C#_Windows Mobile_Compact Framework - Fatal编程技术网

C# Windows Mobile 5-如何杀死其他应用程序?

C# Windows Mobile 5-如何杀死其他应用程序?,c#,windows-mobile,compact-framework,C#,Windows Mobile,Compact Framework,目前,我正在为Windows Mobile 5.0创建两个应用程序(应用程序A和B),并使用Compact Framework 2.0。应用程序A是主应用程序,B是子应用程序 以下是流程: 启动应用程序A 应用程序A将启动应用程序B 应用程序B将执行一些过程 应用程序B将杀死应用程序A 应用程序B将修补/升级应用程序A。(ala更新管理器) 应用程序B将重新启动应用程序A 应用程序B将退出 现在我陷入了杀戮应用程序A的困境。我确实尝试过使用OpenNETCF ProcessEntry Ki

目前,我正在为Windows Mobile 5.0创建两个应用程序(应用程序A和B),并使用Compact Framework 2.0。应用程序A是主应用程序,B是子应用程序

  • 以下是流程:
  • 启动应用程序A
  • 应用程序A将启动应用程序B
  • 应用程序B将执行一些过程
  • 应用程序B将杀死应用程序A
  • 应用程序B将修补/升级应用程序A。(ala更新管理器)
  • 应用程序B将重新启动应用程序A
  • 应用程序B将退出
现在我陷入了杀戮应用程序A的困境。我确实尝试过使用OpenNETCF ProcessEntry Kill()函数。调用Kill()时,它使设备崩溃

我确实尝试过使用SendMessage(hWnd,WM_CLOSE,0,0)函数,其中WM_CLOSE将具有ProcessEntry.ProcessID值,我没有为hWnd变量赋值。但它没有终止应用程序A。我是否分配了错误的值

我也试过使用

Process.GetProcessById(processEntry.ProcessID).CloseMainWindow()

,但失败,因为GetProcessById仅接受int32值。请注意,processEntry.ProcessID值大于int32值,Compact Framework不支持GetProcessByName()

你能帮我通过应用程序B杀掉应用程序A吗?
谢谢。

您可以使用以下功能尝试本机代码:

processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
success = TerminateProcess(processHandle, 0);
以上代码来自位于的任务管理器


但是,如果您正在为这两个应用程序编写代码,那么最好在这两个应用程序之间设计一种通信机制。这样,您将从应用程序B向应用程序a发送一条消息,应用程序a将自杀。

Stormenet,我硬编码了应用程序的名称。然后我使用OpenNETCF.ToolHelp.ProcessEntry[]=ProcessEntry.getProcesss()生成一个对象来获取所有可用的进程

然后在foreach循环中,如果ProcessEntry对象如:ProcessEntry.ExeFile与“applicationName”匹配,我将使用ProcessEntry.Kill()


我认为您可以从OpenNETCF站点获取OpenNETCF.ToolHelp dll

请注意,如果您试图杀死的应用程序持有打开的端口或其他系统资源,那么它可能会挂起退出。确保在窗体关闭时有效地处理所有内容

这可以通过将材料放入以下位置来实现:

public void Dispose(bool disposing)
{
}
主窗体设计器中的代码块,或者如果您选择了不以Windows窗体为中心的体系结构,则只需在Application.run(new YourForm())之后运行dispose调用,它将在应用程序关闭后执行


如果你真的觉得很懒,那么只需设置一些析构函数(也称为终结器~),但如果你这样做的话,在“析构函数”时要小心在托管对象之间的关系中导航,因为无法保证将销毁哪些order对象。

ctacke,我认为应用程序A崩溃是由于一些正在运行的线程未正确关闭或仍在后台运行,因为在应用程序B执行Kill()函数期间,应用程序A将运行多个线程


如果我使用SendMessage(hWnd,WM_CLOSE,0,0)函数,它不会使设备崩溃(这是一件好事)。。。它只关闭窗体。(应用程序A包含多种形式,例如:frmLogin和frmMainMenu)。嗯,也许我需要把hWnd指向正确的表单…

现在我走的是另一条路线

下载补丁并将其放入临时文件夹后,我将使用OpenNETCF.WindowsCE.PowerManagement.SoftReset()进行软重置


应用程序B将在启动时启动,然后它将扫描临时文件夹并用新版本替换应用程序A。

如何从appA获取procID?您是通过命令行传递它,还是通过它的窗口名获取它?我非常感兴趣的是,当使用SDF时,您所说的“设备崩溃”是什么意思。它只是调用toolhelp API,因此应该非常基本(我至少在Axim x51上的WinMo 5.0下对其进行了测试)。