c# - 如何在 Windows Mobile 6.5 上终止进程

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

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

请帮忙。

最佳答案

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

如果一个进程确实拥有 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.");

关于c# - 如何在 Windows Mobile 6.5 上终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31922784/

相关文章:

c# - 检查控件是否为 TabControl 中的文本框

c++ - 如何为类 union 类编写析构函数

c++ - 在数据结构中存储不同尺寸的图像,OpenCV

c# - 如何从 windows-mobile 2005 打印到条码打印机?

windows-mobile - 如何自动更新Windows Mobile应用程序

exception - Compact Framework 非特定文化异常消息

c# - 尝试获取 ICacheManager 类型的实例时发生激活错误, key "Cache Manager"

c# - 正则表达式以匹配电子邮件

c# - LINQ:如何在不对数组使用 For 循环的情况下使用 RemoveAll

c++ - 线程安全的并行 RNG 比顺序 rand() 慢