【问题标题】:How to kill process on Windows Mobile 6.5如何在 Windows Mobile 6.5 上杀死进程
【发布时间】:2015-11-02 13:23:26
【问题描述】:

我使用ProcessCE

它在 Windows mobile 6.1 上运行良好。 但是在 Windows Mobile 6.5 上 -> 当我使用 Terranova.API 终止时,TerminateProcess 会抛出异常,错误为 6 = ERROR_INVALID_HANDLE。

internal static void KillProcess(IntPtr pid)
    {

        IntPtr process_handle = OpenProcess(PROCESS_TERMINATE, false, (int)pid);

        if (process_handle == (IntPtr)INVALID_HANDLE_VALUE)
            throw new Win32Exception(Marshal.GetLastWin32Error(), "OpenProcess failed.");

        try
        {
            bool result = TerminateProcess(process_handle, 0);

            if (result == false)
                throw new Win32Exception(Marshal.GetLastWin32Error(), "TerminateProcess failed."); //THROW EXCEPTION on Windows Mobile 6.5

        }
        finally
        {
            CloseHandle(process_handle);
        }
    }

请帮忙。

【问题讨论】:

    标签: c# c++ windows-mobile compact-framework windows-mobile-6


    【解决方案1】:

    代码错误地检查OpenProcess() 是否失败。 OpenProcess 的文档说明函数失败时的返回值为 NULL。在 C 中,NULL 只是一个扩展为 0 的宏,因此在 C# 中,在引用 Win32 API 时应该使用 IntPtr.Zero 代替 NULL

    如果进程确实有INVALID_HANDLE_VALUE 的句柄,那么在没有错误条件时,这段代码会抛出异常。

    Win32 API 不一致地使用HANDLE。在某些情况下,函数在失败时返回NULL,在大多数情况下,函数在错误时返回INVALID_HANDLE_VALUE。这是函数返回 NULL 而不是 INVALID_HANDLE_VALUE 以指示失败的情况之一。

    if (process_handle == IntPtr.Zero)
                throw new Win32Exception(Marshal.GetLastWin32Error(), "OpenProcess failed.");
    

    【讨论】:

      【解决方案2】:

      OpenProcess 返回的 HANDLE 无效的一个原因可能是 WM6.5 和 should be set to 0 不支持 fdwAccess 参数。

      除此之外,检查返回值是否为 NULL(不是 INVALID_HANDLE_VALUE),并验证 pid 是否有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2012-06-08
        • 1970-01-01
        • 2012-06-13
        • 2015-04-17
        • 2022-08-08
        相关资源
        最近更新 更多