Entwickler-Ecke

C# - Die Sprache - Ausdruck ist immer "false" (IntPtr)


mumpiz - Mi 20.09.17 15:11
Titel: Ausdruck ist immer "false" (IntPtr)
Hallo,

die IDE gibt mir den Hinweis dass folgender Ausdruck immer false ist.

Kann mir jemand sagen warum?


C#-Quelltext
1:
2:
3:
4:
5:
hProcess = ProcessMemoryReaderApi.OpenProcess((uint)access, 1, (uint)ReadProcess.Id);
if (hProcess == null//<<< Expression is always 'false'
{
  throw new Exception("Opening process failed!");
}


Ich möchte das Programm daran hindern weiter zu machen wenn ein Fehler beim öffnen eines Prozesses aufgetreten ist.

Moderiert von user profile iconTh69: Titel geändert ("(IntPtr)" hinzugefügt)


Delphi-Laie - Mi 20.09.17 15:33

Dann wird wohl hProcess stets ungleich Null sein.

Edit: Das Problem ist wohl, daß Du ein ungültiges OpenProcess abfangen möchtest...dann wird hProcess wohl Null sein.


Blup - Mi 20.09.17 15:44

Vieleicht so?

C#-Quelltext
1:
if (hProcess == 0)                    


Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Delete - Mi 20.09.17 15:45

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delphi-Laie - Mi 20.09.17 15:48

Liebe Experten, dazu eine fast philosophische Frage: Kann der Compiler nicht bemerken, daß die Typen zum einen des Handles und dazu der des für den Vergleich kredenzten Wertes nicht übereinstimmen, und daraufhin einen paßgenaueren Alarm schlagen?


Blup - Mi 20.09.17 16:05

Man kann nicht alles haben, automatische Typkonvertierung und Typprüfung.


Ralf Jansen - Mi 20.09.17 16:17

Eigentlich bekommt man bei einem solchen Vergleich von VS eine Warnung

Zitat:
The result of the expression is always 'false' since a value of type 'blahblah' is never equal to 'null' of type 'blahblah?'


Hilft natürlich nur wenn man nicht der Unart anheimfällt Warnungen zu ignorieren weil man in seinem Code schon so viele hat das man die Relevanten nicht findet.


mumpiz - Mi 20.09.17 16:41

user profile iconBlup hat folgendes geschrieben Zum zitierten Posting springen:
Vieleicht so?

C#-Quelltext
1:
if (hProcess == 0)                    

Das habe ich zuerst probiert, dann kommt beim erstellen allerdings diese Fehlermeldung:

Quelltext
1:
Operator '==' cannot be applied to operands of type 'System.IntPtr' and 'int' (CS0019) -                    

Wenn IntPtr hProcess nicht initialisiert wird, welchen Wert hat dieser dann?

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
... die genaue Quellangabe zur Klasse ProcessMemoryReaderApi() wäre fein gewesen ...


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
static class ProcessMemoryReaderApi
{
   ....
   [DllImport("kernel32.dll")]
   public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);
   ....
}


Gruß

Moderiert von user profile iconTh69: Beitragsformatierung (Zitate) überarbeitet.


Th69 - Mi 20.09.17 16:44


C#-Quelltext
1:
if (hProcess == IntPtr.Zero)                    

s. IntPtr.Zero [https://msdn.microsoft.com/de-de/library/system.intptr.zero(v=vs.110).aspx]


Delete - Mi 20.09.17 16:54

- Nachträglich durch die Entwickler-Ecke gelöscht -


mumpiz - Mi 20.09.17 16:55

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
if (hProcess == IntPtr.Zero)                    

s. IntPtr.Zero [https://msdn.microsoft.com/de-de/library/system.intptr.zero(v=vs.110).aspx]


Ah super, genau.

Danke!