wince 外部程序的关闭和打开
来源:互联网 发布:ipad 下载软件 编辑:程序博客网 时间:2024/05/16 02:04
最近在做一个wince的项目,里面涉及到程序升级的问题。
升级之前的步骤,肯定是数据下载,然后替换,传输的过程不多过多描述,只是在开发的过程用到了对外部程序的打开和关闭,在这里做个备份。
程序里面有三个类。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Runtime.InteropServices;using System.Text;namespace ArmAssistBll{ /// <summary> /// Static class that provides Windows CE process information and manipulation. /// The biggest difference with the Compact Framework's Process class is that this /// class works with the full path to the .EXE file. And not the pathless .EXE file name. /// </summary> public static class ProcessCE { private const int MAX_PATH = 260; private const int TH32CS_SNAPPROCESS = 0x00000002; private const int TH32CS_SNAPNOHEAPS = 0x40000000; private const int INVALID_HANDLE_VALUE = -1; private const int PROCESS_TERMINATE = 1; /// <summary> /// Returns an array with information about running processes. /// </summary> ///<exception cref="Win32Exception">Thrown when enumerating the processes fails.</exception> public static ProcessInfo[] GetProcesses() { List<ProcessInfo> procList = new List<ProcessInfo>(); IntPtr handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0); if ((Int32)handle == INVALID_HANDLE_VALUE) throw new Win32Exception(Marshal.GetLastWin32Error(), "CreateToolhelp32Snapshot error."); try { PROCESSENTRY processentry = new PROCESSENTRY(); processentry.dwSize = (uint)Marshal.SizeOf(processentry); //Get the first process int retval = Process32First(handle, ref processentry); while (retval == 1) { procList.Add(new ProcessInfo(new IntPtr((int)processentry.th32ProcessID), (int)processentry.cntThreads, (int)processentry.th32MemoryBase, (int)processentry.th32ParentProcessID)); retval = Process32Next(handle, ref processentry); } } finally { CloseToolhelp32Snapshot(handle); } return procList.ToArray(); } /// <summary> /// Checks if the specified .EXE is running. /// </summary> /// <param name="fullpath">The full path to an .EXE file.</param> /// <returns>Returns true is the process is running.</returns> /// <exception cref="Win32Exception">Thrown when taking a system snapshot fails.</exception> public static bool IsRunning(string fullpath) { return (FindProcessPID(fullpath) != IntPtr.Zero); } /// <summary> /// Finds and kills if the process for the specified .EXE file is running. /// </summary> /// <param name="fullpath">The full path to an .EXE file.</param> /// <returns>True if the process was terminated. False if the process was not found.</returns> /// <exception cref="Win32Exception">Thrown when opening or killing the process fails.</exception> public static bool FindAndKill(string fullpath) { IntPtr pid = FindProcessPID(fullpath); if (pid == IntPtr.Zero) return false; Kill(pid); return true; } /// <summary> /// Terminates the process with the specified Process Id. /// </summary> /// <param name="pid">The Process Id of the process to kill.</param> /// <exception cref="Win32Exception">Thrown when opening or killing the process fails.</exception> internal static void Kill(IntPtr pid) { IntPtr process_handle = OpenProcess(PROCESS_TERMINATE, false, (int)pid); if (process_handle == (IntPtr)INVALID_HANDLE_VALUE) throw new Win32Exception(Marshal.GetLastWin32Error(), "OpenProcess failed."); try { bool result = TerminateProcess(process_handle, 0); if (result == false) throw new Win32Exception(Marshal.GetLastWin32Error(), "TerminateProcess failed."); } finally { CloseHandle(process_handle); } } /// <summary> /// Finds the Process Id of the specified .EXE file. /// </summary> /// <param name="fullpath">The full path to an .EXE file.</param> /// <returns>The Process Id to the process found. Return IntPtr.Zero if the process is not running.</returns> ///<exception cref="Win32Exception">Thrown when taking a system snapshot fails.</exception> public static IntPtr FindProcessPID(string fullpath) { fullpath = fullpath.ToLower(); IntPtr snapshot_handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPNOHEAPS, 0); if ((Int32)snapshot_handle == INVALID_HANDLE_VALUE) throw new Win32Exception(Marshal.GetLastWin32Error(), "CreateToolhelp32Snapshot failed."); try { PROCESSENTRY processentry = new PROCESSENTRY(); processentry.dwSize = (uint)Marshal.SizeOf(processentry); StringBuilder fullexepath = new StringBuilder(1024); int retval = Process32First(snapshot_handle, ref processentry); while (retval == 1) { IntPtr pid = new IntPtr((int)processentry.th32ProcessID); // Writes the full path to the process into a StringBuilder object. // Note: If first parameter is IntPtr.Zero it returns the path to the current process. GetModuleFileName(pid, fullexepath, fullexepath.Capacity); if (fullexepath.ToString().ToLower() == fullpath) return pid; retval = Process32Next(snapshot_handle, ref processentry); } } finally { CloseToolhelp32Snapshot(snapshot_handle); } return IntPtr.Zero; } [DllImport("coredll.Dll", EntryPoint = "CreateProcess", SetLastError = true)] public extern static int CreateProcess(string strImageName, string strCmdLine, IntPtr pProcessAttributes, IntPtr pThreadAttributes, int bInheritsHandle, int dwCreationFlags, IntPtr pEnvironment, IntPtr pCurrentDir, IntPtr bArray, ProcessContext oProc); [DllImport("toolhelp.dll", SetLastError = true)] private static extern IntPtr CreateToolhelp32Snapshot(uint flags, uint processID); [DllImport("toolhelp.dll")] private static extern int CloseToolhelp32Snapshot(IntPtr snapshot); [DllImport("toolhelp.dll")] private static extern int Process32First(IntPtr snapshot, ref PROCESSENTRY processEntry); [DllImport("toolhelp.dll")] private static extern int Process32Next(IntPtr snapshot, ref PROCESSENTRY processEntry); [DllImport("coredll.dll", SetLastError = true)] private static extern int GetModuleFileName(IntPtr hModule, StringBuilder lpFilename, int nSize); [DllImport("coredll.dll", SetLastError = true)] private static extern bool TerminateProcess(IntPtr hProcess, uint ExitCode); [DllImport("coredll.dll", SetLastError = true)] private static extern IntPtr OpenProcess(int flags, bool fInherit, int PID); [DllImport("coredll.dll")] private static extern bool CloseHandle(IntPtr handle); private struct PROCESSENTRY { public uint dwSize; public uint cntUsage; public uint th32ProcessID; public uint th32DefaultHeapID; public uint th32ModuleID; public uint cntThreads; public uint th32ParentProcessID; public int pcPriClassBase; public uint dwFlags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] public string szExeFile; public uint th32MemoryBase; public uint th32AccessKey; } } // end of class}
using System;namespace ArmAssistBll{ public class ProcessContext { public Int32 hProcess; public Int32 hThread; public Int32 ProcessID; public Int32 ThreadID; }}
using System;using System.ComponentModel;using System.Runtime.InteropServices;using System.Text;namespace ArmAssistBll{ /// <summary> /// Contains information about a process. /// This information is collected by ProcessCE.GetProcesses(). /// </summary> public class ProcessInfo { [DllImport("coredll.dll", SetLastError = true)] private static extern int GetModuleFileName(IntPtr hModule, StringBuilder lpFilename, int nSize); private const int INVALID_HANDLE_VALUE = -1; private IntPtr _pid; private int _threadCount; private int _baseAddress; private int _parentProcessID; private string _fullPath; internal ProcessInfo(IntPtr pid, int threadcount, int baseaddress, int parentid) { _pid = pid; _threadCount = threadcount; _baseAddress = baseaddress; _parentProcessID = parentid; StringBuilder sb = new StringBuilder(1024); GetModuleFileName(_pid, sb, sb.Capacity); _fullPath = sb.ToString(); } /// <summary> /// Returns the full path to the process .EXE file. /// </summary> /// <example>"\Program Files\Acme\main.exe"</example> public override string ToString() { return _fullPath; } public int BaseAddress { get { return _baseAddress; } } public int ThreadCount { get { return _threadCount; } } /// <summary> /// Returns the Process Id. /// </summary> public IntPtr Pid { get { return _pid; } } /// <summary> /// Returns the full path to the process .EXE file. /// </summary> /// <example>"\Program Files\Acme\main.exe"</example> public string FullPath { get { return _fullPath; } } public int ParentProcessID { get { return _parentProcessID; } } /// <summary> /// Kills the process. /// </summary> /// <exception cref="Win32Exception">Thrown when killing the process fails.</exception> public void Kill() { ProcessCE.Kill(_pid); } }}
使用的过程如下:
using System;using System.Linq;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Xml.Linq;using ArmAssistBll;using System.Reflection;using System.Diagnostics;namespace ArmAssist{ public partial class frmMain : Form { #region 字段 private XDocument _doc = null; private string _fileName = string.Empty; private string _processName = string.Empty; #endregion public frmMain() { InitializeComponent(); } private void btnClose_Click(object sender, EventArgs e) { ProcessInfo[] list = ProcessCE.GetProcesses(); foreach (ProcessInfo item in list) { Debug.WriteLine("Process item: " + item.FullPath); if (item.FullPath.IndexOf(this._processName)>0) { item.Kill(); } } } private void frmMain_Load(object sender, EventArgs e) { _doc = XDocument.Load(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) + @"\Conf\assist.xml"); this._fileName = _doc.Element("Set").Element("FileName").Value.ToString(); this._processName = _doc.Element("Set").Element("ProcessName").Value.ToString(); } private void btnOpen_Click(object sender, EventArgs e) { ProcessContext pi = new ProcessContext(); ProcessCE.CreateProcess(this._fileName+ this._processName, "", IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, pi); } }}下面是配置文件的内容。
<?xml version="1.0" encoding="utf-8" ?><Set> <ProcessName>powerclientcontrol</ProcessName> <FileName>Program Files\powerclientcontrol\</FileName></Set>
0 0
- wince 外部程序的关闭和打开
- c#打开和关闭外部程序
- WinCE下打开外部程序(VBNET)
- VB中关闭shell打开的外部EXE程序
- VB中关闭shell打开的外部EXE程序
- 启动和关闭外部程序
- 在WinCE下使用C#来打开一个外部程序
- wince下使用C#打开一个外部程序
- wince下使用C#打开一个外部程序
- c# wince 获取外部程序的图标
- 如何在自己的系统中打开并关闭外部程序
- maya中打开外部程序和网站
- 获取WINCE和WINXP的外部存储器
- vc关闭外部程序
- vc 关闭外部程序
- QT:关闭外部程序
- 批处理关闭进程和打开某程序
- Android程序打开和关闭输入法
- Ganglia3.1.7 Install and Config
- 圆形风格的移动应用实例
- Struts2相关知识整合
- php 前一天或后一天的日期
- WEB架构师成长之路之一-走正确的路
- wince 外部程序的关闭和打开
- http://www.trinea.cn/
- Spring事务配置的5种方式
- centos中文输入法设置
- struts 常用的constant作用和配置
- 集群 分布式计算
- Linux Shell 之 Shell中的函数调用
- 历届博客之星获奖博客分享
- 52 Android fragment_ActionBar