0

我试图查看有多少应用程序实例在 MC65 设备(Windows Mobile 6.5 设备)上运行。然后,如果有多个应用程序实例正在运行,则杀死所有实例并运行该应用程序。我在这里试过那个代码。但它不适用于 MC65 设备。我相信这是因为它是一个符号设备,我在某处读到它们的行为与非符号设备不同。

有谁知道如何以编程方式找出符号设备上正在运行的进程?

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

4

1 回答 1

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 测试应用程序的一部分。

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

如果您仍需要帮助,请告诉我们。

于 2013-04-23T14:38:55.350 回答