2013-04-22 58 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