如何在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);
}
}
请帮。
代码错误地检查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是否有效。