如何在Windows Mobile 6.5上杀死进程

本文关键字:进程 Windows Mobile | 更新日期: 2023-09-27 18:07:08

我使用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);
        }
    }

请帮。

如何在Windows Mobile 6.5上杀死进程

代码错误地检查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.");

从OpenProcess返回的HANDLE无效的一个原因可能是WM6.5不支持fdwAccess参数,应该设置为0。

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