0 votes

Appels API Windows Mobile - succès mais GetLastWin32Error renvoie un code d'erreur - dois-je m'inquiéter ?

Je suis un novice en matière d'appels PInvoke. J'ai cherché sur Google, car la question semble assez simple, mais je n'ai rien trouvé.

Je fais plusieurs appels à l'API Windows Mobile à la suite (pour détecter si mon application est déjà en cours d'exécution et la réactiver). Tout fonctionne très bien, mais je voulais mettre en place une journalisation, etc. pour les moments où cela ne fonctionne pas correctement.

En écrivant ce code, j'ai découvert que je recevais des codes d'erreur même lorsque mes appels renvoyaient apparemment un résultat valide et que le résultat valide était utilisé avec succès par un appel ultérieur (ce qui prouve qu'il est valide, je pense).

Par exemple, j'appelle CreateToolhelp32Snapshot qui me renvoie un handle vers un snapshot des processus en cours d'exécution. L'appel à Marshal.GetLatWin32Error immédiatement après renvoie l'erreur 6 qui signifie apparemment Invalid Handle. Mais la valeur retournée est utilisée avec succès par les appels ultérieurs à d'autres méthodes et l'ensemble du processus fonctionne. C'est bien cet appel particulier qui provoque l'erreur 6, car si vous appelez Marshal.GetLatWin32Error juste avant cet appel, il renvoie 0.

Les appels à Process32First et Process32Next ont un comportement similaire, c'est-à-dire qu'ils me donnent des informations sur le processus sans problème, mais affichent parfois l'erreur 6. Je (pense) savoir ce qui se passe car j'appelle Marshal.GetLatWin32Error immédiatement avant et après chaque appel et parfois c'est 0 avant et 6 après. Actuellement, j'obtiens toujours un résultat positif (soit un handle qui fonctionne avec les appels suivants, soit une valeur qui prend la valeur 1 si int ou true si bool et l'information du processus est copiée avec succès dans mon tampon).

Alors, ....., dois-je m'en préoccuper ? Tout cela fonctionne.... Est-ce que je me soucie de l'erreur qui se produit si je reçois un résultat qui est utilisé avec succès par le reste du processus ? Mon instinct me dit que oui, sûrement ? Quoi qu'il en soit, comment puis-je savoir si tout va bien si je reçois apparemment un résultat positif mais qu'un code d'erreur est également affiché ? Je fais des cauchemars à l'idée de publier un système instable qui ne me donnera pas d'informations utiles sur les erreurs en retour........

MISE À JOUR

Voici les résultats de mon code loggong pour essayer d'illustrer ce dont je parle pour les personnes intéressées. En bref, le code vérifie s'il y a des copies déjà en cours d'exécution de lui-même, puis s'il y a des copies déjà en cours d'exécution du client et enfin 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 à l'exception des derniers appels à Process32Next pour lesquels l'échec avec le code 18 indique que la dernière entrée a été atteinte. Et je viens de remarquer que ShowWindow résulte en une erreur 120 qui n'est pas supportée, donc je vais supprimer cet appel.

Mes deux questions sont donc les suivantes :

Pourquoi ces erreurs alors que j'ai obtenu un succès ?
Et lorsque les erreurs avant et après l'appel sont les mêmes, comment puis-je savoir s'il s'agit de l'ancienne erreur ou d'une deuxième occurrence de la même erreur ?

2voto

Andrew Medico Points 11338

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

1voto

sharptooth Points 93379

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 le cas. C'est pourquoi vous ne pouvez pas distinguer un ancien code d'erreur d'un nouveau. N'appelez GetLastError() que dans les cas où MSDN vous indique de le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X