Windows Mobile API-Aufrufe - Erfolg aber GetLastWin32Error gibt Fehlercode - sollte ich mir Sorgen machen?

StackOverflow https://stackoverflow.com/questions/606048

Frage

Ich bin ein Neuling zu PInvoke nennt. Ich habe dies gegoogelt, da es wie eine einfache genug Frage scheint aber keine Freude.

Ich mache muliple Windows Mobile API-Aufrufe in einer Reihe (zu erkennen, ob meine app bereits läuft und dann wieder aktivieren). Alles funktioniert gut und schön, aber ich wollte in der Protokollierung usw. für die Zeiten setzen, wenn es nicht OK funktioniert.

Während diesen Code zu schreiben fand ich, dass ich Fehler bekommen Codes, selbst wenn meine Anrufe anscheinend ein gültiges Ergebnis und das gültige Ergebnis zurückgeben wird erfolgreich durch einen nachfolgenden Aufruf verwendet (erweist es ist gültig, denke ich.)

z. Ich nenne CreateToolhelp32Snapshot, die mich zurück mit einem Griff zu einem Schnappschuss von aktuell laufenden Prozesse gibt. Der Aufruf Marshal.GetLatWin32Error immediatley nach Retouren Fehler 6, die anscheinend ungültige Handle bedeutet. Aber der zurückgegebene Wert wird erfolgreich von den nachfolgenden Aufrufen anderer Methoden und den gesamten Prozess Werke verwendet. Es ist auf jeden Fall diese besondere Aufforderung, die Fehlersätze 6, denn wenn Sie rufen Marshal.GetLatWin32Error kurz vor dem Aufruf es 0 zurück.

Anrufe zu Process32First und Process32Next ähnliches Verhalten zeigen, dh sie mir Informationen glücklich verarbeiten geben, aber manchmal setzen Fehler 6. Ich (glaube) Ich weiß, dass dies geschieht, weil ich Marshal.GetLatWin32Error immediatley rufen vor und nach jedem Anruf und manchmal ist es 0 vor und 6 nach. Derzeit bin ich immer ein erfolgreiches Ergebnis zu erzielen (entweder ein Griff, der mit nachfolgenden Aufrufen oder einem Wert arbeitet, der auf 1 wirft, wenn int oder true, wenn bool und Prozess-Info erfolgreich in meinen Puffer kopiert).

So ..... sollte mich das interessieren? Es ist alles funktioniert .... Sie ist mir egal, was Fehler gesetzt wird, wenn ich wieder ein Ergebnis bekommen, die erfolgreich durch den Rest des Prozesses verwendet wird? Mein Bauch sagt ja ich weiß, sicher? So oder so, wie weiß ich eigentlich, wenn alles in Ordnung ist, wenn ich scheinbar ein erfolgreiches Ergebnis zurück bekommen, aber ein Fehlercode wird ebenfalls gesetzt? Ich habe Alpträume über ein instabiles System freisetzt, die nicht mir nützliche Informationen Fehler werden geben wird wieder ........

UPDATE

Dies ist das Ergebnis meiner loggong Code zu versuchen und zu zeigen, was ich spreche für alle Interessierten. Kurz gesagt, reaktiviert die Code überprüft bereits laufenden Kopien von sich selbst, dann für bereits laufende Kopien des Kunden und dann Client, wenn es gefunden wurde.

Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 0, Post-call error code: 6
Method name: Process32First, Result: True, Pre-call error code: 6, Post-call error code: 6               
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 6                
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                                                                            
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18              
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 6     
Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 6, Post-call error code: 0
Method name: Process32First, Result: True, Pre-call error code: 0, Post-call error code: 0               
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                                                                      
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18              
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 0     
Method name: ShowWindow, Result: True, Pre-call error code: 0, Post-call error code: 120                 
Method name: SetForegroundWindow, Result: True, Pre-call error code: 120, Post-call error code: 6        

Die Ergebnisse sind immer wahr mit Ausnahme der letzten Anrufe zu Process32Next für den Ausfall mit Code 18 der letzte Eintrag angibt erreicht wurde. Und ich habe gerade bemerkt, Showwindow wird, was zu Fehler 120, die nicht so unterstützt wird, nehme ich, dass rufen.

Also meine beiden aktuellen Fragen sind:

Warum die Fehler, wenn ich einen Erfolg hat?
Und wenn die Pre-Call-und Post-Call-Fehler gleich sind, wie kann ich wissen, ob dies der alte Fehler oder ein zweites Auftreten des gleichen Fehlers war?

War es hilfreich?

Lösung

Sie sollten nicht GetLastWin32Error (GetLastError) anrufen, es sei denn CreateToolhelp32Snapshot kehrt INVALID_HANDLE_VALUE.

Siehe http://msdn.microsoft.com/en-us/library/ms682489 ( VS.85) aspx

Andere Tipps

Sie erwarten GetLastError () 0 nach jedem erfolgreichen Aufruf einer Funktion zurückzukehren. Aber dies bedeutet, dass diese Funktionen aufrufen SetLastError (0) in den Epilog, die nicht immer getan. Deshalb sollten Sie nicht zwischen einem alten Fehlercode und einem neuen unterscheiden können. Nur rufen Sie GetLastError () für Fälle MSDN sagt Ihnen, dies zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top