я использую 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
, В С, 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.");
Одной из причин, по которым HANDLE, возвращенный из OpenProcess, является недопустимым, может быть то, что параметр fdwAccess не поддерживается в WM6.5 и должен быть установлен в 0.
Кроме этого, проверьте возвращаемое значение для NULL (не INVALID_HANDLE_VALUE) и убедитесь, что pid действителен.