2017-12-22 2 views
0

Hier ist der Code, den ich einen Prozess zu öffnen, schrieb:C# Open gibt Fehler 1150

 [DllImport("kernel32.dll", SetLastError = true)] 
     private static extern UIntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId); 

     [DllImport("kernel32.dll", SetLastError = true)] 
     private static extern bool CloseHandle(UIntPtr hObject); 

     private const uint PROCESS_QUERY_INFORMATION = 0x0400; 

     public static void processInfo() { 
      uint PID = 3144; 
      UIntPtr handle = UIntPtr.Zero; 
      handle = OpenProcess(PROCESS_QUERY_INFORMATION, false, PID); 
      Console.WriteLine(Marshal.GetLastWin32Error()); 
      Console.WriteLine(handle); 
      if (!handle.Equals(UIntPtr.Zero)) { 
       CloseHandle(handle); 
      } 
     } 

Marshal.GetLastWin32Error() kehrt Fehler 1150 für jeden Prozess. Von MSDN:

"ERROR_OLD_WIN_VERSION: Das angegebene Programm ist eine neuere Version von Windows."

Ich führe diesen Code in Windows 2008 R2 in Visual Studio 2015 Community Edition. Target Framework ist in den Projekteinstellungen auf ".NET Framework 4.5.2" eingestellt.

Auch scheint es, dass OpenProcess immer noch seine Arbeit machen kann, weil das zurückgegebene Handle nicht Null ist. Sollte ich über diesen Fehler besorgt sein?

Antwort

2

Aus der Dokumentation:

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein offener Griff in den angegebenen Prozess.

Wenn die Funktion fehlschlägt, ist der Rückgabewert NULL. Um erweiterte Fehler Informationen zu erhalten, rufen Sie GetLastError.

Beachten Sie, dass die einzige Erwähnung von Aufruf GetLastError ist, wenn die Funktion fehlschlägt. Dies wird durch den Rückgabewert angezeigt. Überprüfen Sie den Fehlercode nur, wenn die Funktion fehlschlägt, er hat nur einen aussagekräftigen Wert in dieser Situation. Ihr Fehler ist, dass Sie den Fehlercode unbedingt überprüfen.

handle = OpenProcess(...); 
if (handle == UIntPtr.Zero) 
    // only now call Marshal.GetLastWin32Error 

Beachten Sie auch, dass es sinnlos ist handle zweimal zu vergeben. Sie schrieb:

UIntPtr handle = UIntPtr.Zero; 
handle = OpenProcess(...); 

Sicherlich der Compiler davor gewarnt, dass dies sinnlos war, dass der Wert nicht verwendet wurde zu handhaben zugeordnet. Ihr Code ist etwas verwandt mit:

int i = 1; 
i = 2; 

Ich bin mir sicher, dass Sie das nie tun würden. Ihr Code sollte lauten:

UIntPtr handle = OpenProcess(...);