我正在尝试查看MC65设备(Windows Mobile 6.5设备)上运行了多少个应用程序实例。然后,如果有多个应用程序实例正在运行kill all instances并运行该应用程序。我尝试过代码here。但它不适用于MC65设备。我相信这是因为它是一个符号设备,我在某处读到它们的行为与非符号设备不同。
有人知道如何以编程方式找出符号设备上正在运行的进程吗?
更新:进一步测试后,设备在创建正在运行的进程的快照时遇到问题。仍然没有找到解决方案。
答案 0 :(得分: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目标“Windows Mobile ...”中创建和运行SmartDevice项目时,这也是默认设置。 如果您的目标是基于标准Windows CE的SDK,则不会生成自动代码来阻止应用程序启动代码中的多个实例。
如果您仍需要帮助,请告诉我们。