2013-04-22 2 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 прекратит их, если предыдущий экземпляр уже запущен. Это также является значением по умолчанию при создании и запуске проекта SmartDevice в настройке CSharp или CPP «Windows Mobile ...». Если вы настроили таргетинг на стандартный SDK на базе стандартного Windows CE, то нет автоматического кода, созданного для предотвращения появления нескольких экземпляров в стартовом коде приложения.

Сообщите нам, если вам по-прежнему нужна помощь.

+0

Спасибо. Флаг NoHeap был именно тем, что мне нужно. Замечание: хотя по большей части, когда я выполняю process.start, будет запущен только один экземпляр. Я обнаружил, что если вы правильно назовете свои звонки, вы можете запустить несколько экземпляров программы. – GH23

+0

Да, флаг noHeap необходим с WM5/CE5. Сроки не должны запускать приложение с несколькими экземплярами. Приложение может проверяться при начале, если оно уже запущено, а затем переключиться на предыдущий экземпляр и завершить работу. – josef

+0

Тогда я не знаю, как это происходит, но почему-то несколько экземпляров одного из моих приложений запускаются. Большую часть времени я вижу только один экземпляр, но иногда я видел два или три экземпляра. Во всяком случае, еще раз спасибо за помощь, с которой он работал, как шарм. – GH23

Смежные вопросы