2009-03-03 5 views
0

Je suis un débutant aux appels PInvoke. J'ai googlé cela car il semble être une question assez simple mais pas de joie.Appels d'API Windows Mobile - succès mais GetLastWin32Error renvoie le code d'erreur - devrais-je m'inquiéter?

Je fais Muliple appels API Windows Mobile dans une ligne (pour détecter si mon application est en cours d'exécution, puis le réactiver). Tout fonctionne bien et dandy mais je voulais mettre en journalisation etc pour les moments où cela ne fonctionne pas bien.

Tout en écrivant ce code, je trouve que je vais obtenir les codes d'erreur, même si mes appels reviennent apparemment un résultat valable et valide le résultat est utilisé avec succès par un appel ultérieur (prouvant qu'il est valable, je pense.)

Par ex J'appelle CreateToolhelp32Snapshot qui me renvoie un aperçu d'un instantané des processus en cours d'exécution. Appel Marshal.GetLatWin32Error immédiatement après renvoie l'erreur 6 qui signifie apparemment Invalid Handle. Mais la valeur renvoyée est utilisée avec succès par les appels ultérieurs à d'autres méthodes et l'ensemble du processus fonctionne. C'est certainement cet appel particulier qui définit l'erreur 6 parce que si vous appelez Marshal.GetLatWin32Error juste avant l'appel, il renvoie 0.

Les appels à Process32First et Process32Next présentent un comportement similaire, c'est-à-dire qu'ils me donnent des informations de processus heureusement, mais parfois mis en erreur. (Je pense) Je sais que cela se passe parce que j'appelle Marshal.GetLatWin32Error immédiatement avant et après chaque appel et parfois c'est 0 avant et 6 après. Actuellement, je reçois toujours un résultat réussi (soit un handle qui fonctionne avec les appels suivants, soit une valeur qui renvoie 1 si int ou true si bool et process info sont correctement copiés dans mon buffer).

Alors ..... dois-je prendre soin? Tout fonctionne ... Est-ce que je me soucie de l'erreur qui se déclenchera si je récupère un résultat qui est utilisé avec succès par le reste du processus? Mon instinct dit oui je le fais, sûrement? Dans un cas comme dans l'autre, comment puis-je savoir si tout va bien si j'obtiens apparemment un résultat réussi, mais un code d'erreur est également défini? Je cauchemars à propos de la libération d'un système instable qui ne sera pas de me donner des informations d'erreur utile retour ........

MISE À JOUR

Voici les résultats de mon code loggong pour essayer d'illustrer ce que Je parle de toute personne intéressée. En bref, le code vérifie les copies déjà exécutées de lui-même, puis les copies déjà exécutées du client, puis réactive le client s'il a été trouvé.

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   

Les résultats sont toujours vrai, sauf pour les derniers appels à Process32Next pour lesquels l'échec avec le code 18 indique la dernière entrée a été atteint. Et je viens juste de remarquer que ShowWindow est à l'origine de l'Erreur 120 qui n'est pas supportée donc je vais prendre cet appel.

donc mes deux questions sont réelles:

Pourquoi les erreurs quand je suis arrivé un succès?
Et, lorsque les erreurs pré-appel et post-appel sont les mêmes, comment puis-je savoir si cela était l'ancienne erreur ou une seconde apparition de la même erreur?

Répondre

2

Vous ne devez pas appeler GetLastWin32Error (GetLastError), sauf si CreateToolhelp32Snapshot renvoie INVALID_HANDLE_VALUE.

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

+0

C'est le peu que je ne comprends pas. Le lien ne dit pas que vous pouvez * seulement * appeler GetLastWin32Error si vous obtenez INVALID_HANDLE_VALUE. Et la documentation pour GetLastWin32Error indique qu'il stocke les erreurs du dernier appel PInvoke où SetError est vrai. La dernière erreur est-elle une œuvre de fiction dans ce cas? –

+0

Ou est-ce juste que cela n'a pas d'importance, sauf si vous obtenez des valeurs de ceratin tel que spécifié par MSDN? –

+0

Nm, j'ai rétréci ma recherche de google basé sur ce que vous avez dit et trouvé ceci: http://blogs.msdn.com/adam_nathan/archive/2003/04/25/56643.aspx –

1

Vous attendez GetLastError() pour revenir 0 après chaque appel réussi de toute fonction. Mais cela implique que ces fonctions appellent SetLastError (0) dans leur épilogue, ce qui n'est pas toujours fait.C'est pourquoi vous ne pouvez pas faire la distinction entre un ancien code d'erreur et un nouveau. Appelez uniquement GetLastError() pour les cas MSDN vous demande de le faire.

+0

Cela n'est-il pas géré par la partie SetLastError = true de l'attribut DllImport? [DllImport ("toolhelp.dll", SetLastError = true)] public statique externe IntPtr CreateToolhelp32Snapshot (uint flags, uint processid); –

+0

La description de l'attribut DllImport dans MSDN indique que SetLastError que vous mentionnez ici ne fait qu'influencer le GetLastError() à l'appelant. Ce n'est pas le WinAPI SetLastError(), juste un modificateur de l'attribut. – sharptooth

+0

Oui merci et j'ai aussi trouvé un blog qui développe ce que vous et Andrew avez dit - voir les commentaires ci-dessus –

Questions connexes