Как убить процесс на Windows Mobile 6.5

я использую 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);
}
}

Пожалуйста помоги.

0

Решение

Код неверно проверяется OpenProcess() за неудачу. Документация для OpenProcess заявляет возвращаемое значение при сбое функции NULL, В С, 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.");
1

Другие решения

Одной из причин, по которым HANDLE, возвращенный из OpenProcess, является недопустимым, может быть то, что параметр fdwAccess не поддерживается в WM6.5 и должен быть установлен в 0.

Кроме этого, проверьте возвращаемое значение для NULL (не INVALID_HANDLE_VALUE) и убедитесь, что pid действителен.

1