Le chiamate API di Windows Mobile - esito positivo ma GetLastWin32Error restituiscono un codice di errore - dovrei preoccuparmi?

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

Domanda

Sono un principiante delle chiamate PInvoke. Ho cercato su Google come sembra una domanda abbastanza semplice ma senza gioia.

Sto effettuando più volte chiamate API di Windows Mobile di fila (per rilevare se la mia app è già in esecuzione e quindi riattivarla). Tutto funziona bene e dandy ma volevo inserire la registrazione ecc. Per i momenti in cui non funziona bene.

Durante la scrittura di questo codice ho scoperto che riceverò codici di errore anche quando le mie chiamate apparentemente restituiscono un risultato valido e il risultato valido viene utilizzato correttamente da una chiamata successiva (dimostrando che è valido penso.)

es. Chiamo CreateToolhelp32Snapshot che mi restituisce un handle a un'istantanea dei processi attualmente in esecuzione. Chiamare Marshal.GetLatWin32Error immediatamente dopo restituisce Error 6 che apparentemente significa handle non valido. Ma il valore restituito viene utilizzato correttamente dalle successive chiamate ad altri metodi e l'intero processo funziona. È sicuramente questa chiamata particolare che imposta l'errore 6 perché se chiami Marshal.GetLatWin32Error appena prima della chiamata restituisce 0.

Le chiamate a Process32Prima e Process32Prossima mostrano un comportamento simile, cioè mi danno felicemente le informazioni di processo ma a volte impostano l'errore 6. I (penso) So che sta succedendo perché chiamo Marshal.GetLatWin32Errore immediatamente prima e dopo ogni chiamata e talvolta è 0 prima e 6 dopo. Attualmente sto sempre ottenendo un risultato positivo (o un handle che funziona con le chiamate successive o un valore che lancia a 1 se int o true se bool e informazioni di processo copiate correttamente nel mio buffer).

Quindi ..... dovrei preoccuparmene? Funziona tutto ... Mi interessa quale errore viene impostato se si ottiene un risultato utilizzato correttamente dal resto del processo? Il mio istinto dice di sì, certo? Ad ogni modo, come faccio a sapere se tutto è a posto se apparentemente ottengo un risultato positivo ma viene impostato anche un codice di errore? Sto avendo incubi sul rilascio di un sistema instabile che non mi restituirà utili informazioni di errore ........

UPDATE

Questi sono i risultati del mio codice di accesso per cercare di illustrare ciò di cui sto parlando per chiunque sia interessato. In breve, il codice controlla le copie già in esecuzione di se stesso, quindi le copie già in esecuzione del client e quindi riattiva il client se è stato trovato.

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        

I risultati sono sempre veri, tranne per le ultime chiamate a Process32Next per cui l'errore con il codice 18 indica che è stata raggiunta l'ultima voce. E ho appena notato che ShowWindow sta causando l'errore 120 che non è supportato, quindi prenderò quella chiamata.

Quindi le mie due domande attuali sono:

Perché gli errori quando ho avuto successo?
E, quando gli errori pre-chiamata e post-chiamata sono gli stessi, come faccio a sapere se si trattava del vecchio errore o di una seconda occorrenza dello stesso errore?

È stato utile?

Soluzione

Non dovresti chiamare GetLastWin32Error (GetLastError) a meno che CreateToolhelp32Snapshot non restituisca INVALID_HANDLE_VALUE.

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

Altri suggerimenti

Si prevede che GetLastError () restituisca 0 dopo ogni chiamata riuscita di qualsiasi funzione. Ma questo implica che quelle funzioni chiamano SetLastError (0) nel loro epilogo, cosa che non sempre viene eseguita. Ecco perché non puoi distinguere tra un vecchio codice di errore e uno nuovo. Chiama GetLastError () solo per i casi in cui MSDN ti dice di farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top