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?
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? –
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? –
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 –