Appels de l'API Windows Mobile - succès, mais GetLastWin32Error renvoie le code d'erreur - devrais-je m'inquiéter?

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

Question

Je suis un débutant pour les appels PInvoke. J'ai googlé ceci car cela semble être une question assez simple mais pas de joie.

Je passe plusieurs appels de l'API Windows Mobile plusieurs fois de suite (pour détecter si mon application est déjà en cours d'exécution, puis pour la réactiver). Tout fonctionne bien et dandy mais je voulais mettre dans la journalisation, etc. pour les moments où cela ne fonctionne pas bien.

En écrivant ce code, j’ai constaté que j’obtiendrais des codes d’erreur même si mes appels renvoient apparemment un résultat valide et que celui-ci est utilisé avec succès par un appel ultérieur (prouvant qu’il est valide, je pense.)

E.g. J'appelle CreateToolhelp32Snapshot, qui me renvoie un descripteur pour un instantané des processus en cours d'exécution. L'appel de Marshal.GetLatWin32Error immédiatement après renvoie l'erreur 6, qui signifie apparemment un traitement invalide. 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, car 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 communiquent des informations sur le processus mais qu’ils affectent parfois l’erreur 6. Je sais que cela se produit car j’appelle Marshal.GetLatWin32Error immédiatement avant et après chaque appel et parfois 0. avant et 6 après. Actuellement, je reçois toujours un résultat positif (soit un descripteur qui fonctionne avec les appels suivants, soit une valeur qui attribue la valeur 1 si int ou vrai, si bool et les informations de processus copiées avec succès dans mon tampon).

Alors ..... devrais-je m'en soucier? Tout fonctionne ... Suis-je soucieux de savoir quelle erreur est générée si je récupère un résultat utilisé avec succès par le reste du processus? Mon instinct me dit que oui, sûrement? Quoi qu’il en soit, comment savoir si tout va bien si j’obtiens apparemment un résultat positif, mais qu’un code d’erreur est également défini? Je fais des cauchemars à propos de la publication d’un système instable qui ne me donnera pas d’informations d’erreur utiles ........

MISE À JOUR

C’est le résultat de mon code loggong pour essayer d’illustrer ce dont je parle pour les personnes intéressées. En bref, le code recherche des copies déjà en cours d’exécution de lui-même, puis des 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 vrais, sauf pour les derniers appels à Process32Next pour lesquels un échec avec le code 18 indique que la dernière entrée a été atteinte. Et je viens de remarquer que ShowWindow entraîne l'erreur 120 qui n'est pas prise en charge, je vais donc prendre cet appel.

Mes deux questions sont donc les suivantes:

Pourquoi les erreurs quand j'ai eu du succès?
Et, lorsque les erreurs avant et après l’appel sont identiques, comment savoir s’il s’agissait de l’ancienne erreur ou d’une deuxième occurrence de la même erreur?

Était-ce utile?

La solution

Vous ne devriez pas appeler GetLastWin32Error (GetLastError) à moins que CreateToolhelp32Snapshot ne renvoie INVALID_HANDLE_VALUE.

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

Autres conseils

Vous vous attendez à ce que GetLastError () renvoie 0 après chaque appel réussi d'une 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 () dans les cas que MSDN vous a demandé de faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top