2013-04-22 59 views
0

我正在尝试查看MC65设备(Windows Mobile 6.5设备)上运行的应用程序的实例数。然后,如果有多个应用程序实例正在运行,请杀死所有实例并运行该应用程序。我试过这个代码here。但它不适用于MC65设备。我相信这是因为它是一个符号设备,我读过的地方表明它们的行为与非符号设备不同。符号设备杀死进程

有没有人知道如何以编程方式找出哪些进程正在符号设备上运行?

更新:进一步测试时,设备在创建正在运行的进程的快照时遇到问题。还没有找到解决方案。

回答

0

拍摄快照,应该工作正常,但你必须使用一个标志,以避免内存限制抛出一个异常:

[Flags] 
    private enum SnapshotFlags : uint 
    { 
     HeapList = 0x00000001, 
     Process = 0x00000002, 
     Thread = 0x00000004, 
     Module = 0x00000008, 
     Module32 = 0x00000010, 
     Inherit = 0x80000000, 
     All = 0x0000001F, 
     NoHeaps = 0x40000000 
    } 

然后在正常调用CreateToolHelp32Snapshot函数,你可以得到一个进程列表:

public static Dictionary<UInt32, process> getProcessNameList() 
    { 
     int iCnt = 0; 
     //List<processnames> name_list = new List<processnames>(); 
     Dictionary<UInt32, process> _pList = new Dictionary<uint, process>(); 
     uint procID = 0; 
     IntPtr pHandle = CreateToolhelp32Snapshot(SnapshotFlags.Process | SnapshotFlags.NoHeaps, procID); 
     if ((Int32)pHandle == INVALID_HANDLE_VALUE) 
      throw new Exception("CreateToolhelp32Snapshot error: " + Marshal.GetLastWin32Error().ToString()); 

     if ((int)pHandle != INVALID_HANDLE_VALUE) 
     { 
      PROCESSENTRY32 pEntry = new PROCESSENTRY32(); 
      pEntry.dwSize = (uint)Marshal.SizeOf(pEntry); 
      if (Process32First(pHandle, ref pEntry) == 1) 
      { 
       do 
       { 
        //name_list.Add(new processnames(pEntry.th32ProcessID, pEntry.szExeFile)); 
        _pList[pEntry.th32ProcessID] = new process(pEntry.th32ProcessID, pEntry.szExeFile, new List<thread>()); 
        iCnt++; 
       } while (Process32Next(pHandle, ref pEntry) == 1); 
      } 
      else 
       System.Diagnostics.Debug.WriteLine("Process32First error: " + Marshal.GetLastWin32Error().ToString()); 
      CloseToolhelp32Snapshot(pHandle); 
     } 

     return _pList; 
    } 

上面的代码是我的远程ProcessorUsage test application的一部分。

尽管如此,正常的Windows移动应用程序将终止自己,如果以前的实例已经运行。当您在CSharp或CPP中创建并运行SmartDevice项目(目标是“Windows Mobile ...”)时,这也是默认设置。 如果您的目标是基于标准Windows CE的SDK,则不会生成自动代码,以防止应用程序的启动代码中出现多个实例。

让我们知道,如果你还需要帮助。

+0

谢谢你。 NoHeap标志正是我所需要的。附注:尽管在执行process.start时大部分时间只会运行一个实例。我发现,如果你正确调用你的呼叫,你可以启动一个程序的多个实例。 – GH23 2013-04-23 19:08:20

+0

是的,自WM5/CE5以来,noHeap标志是必不可少的。时序不应该启用运行具有多个实例的应用程序。如果应用程序已经在运行,并且切换到之前的实例并自行关闭,应用程序应该在开始时进行检查。 – josef 2013-04-24 04:19:06

+0

然后我不知道它是如何发生的,但不知怎的,我的一个应用程序的多个实例运行。大多数情况下,我只看到一个实例在运行,但偶尔我会看到两个或三个实例。无论如何,再次感谢它的魅力。 – GH23 2013-04-24 13:08:50