J'ai un programme très compliqué qui échoue, et je l'ai simplifié à cet ensemble de test avec un fichier batch et un programme C.Pourquoi ne puis-je pas tester le code retour sous Windows 7?
Mon programme C utilise ExitProcess pour renvoyer le niveau d'erreur à un fichier de traitement par lots. Parfois, sur Windows 7 (Microsoft Windows [Version 6.1.7600]), le niveau d'erreur n'est pas interprété correctement.
Je pense que cela devrait fonctionner pour toujours. Sous Windows XP, il semble fonctionner éternellement. Sur deux machines Windows 7 dual-core différentes (une 64-bit 32 bits) il échoue en quelques minutes.
Je ne peux pas imaginer que je fasse quelque chose de mal, mais au cas où il y aurait quelque chose d'amusant à propos de ExitProcess sur Windows 7, j'ai pensé que je demanderais. Y a-t-il quelque chose que j'ai fait illégalement?
fichier batch pour test.bat cmd.exe:
@ECHO OFF
SET I=0
:pass
SET /A I=I+1
Title %I%
start/wait level250
if errorlevel 251 goto fail
if errorlevel 250 goto pass
:fail
Programme level250.c:
#include "windows.h"
static volatile int Terminate = 0;
static unsigned __stdcall TestThread(void * unused)
{
Terminate = 1;
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
while (Terminate == 0) Sleep(1);
ExitProcess(250);
}
Ma version du compilateur et appel sont:
Microsoft (R) Compilateur d'optimisation C/C++ 32 bits Version 12.00.8804 pour 80 x 86
Droit d'auteur (C) Microsoft Corp 1984-1998. Tous les droits sont réservés.
cl/MT level250.c
Autres informations: J'ai également essayé de courir sous TCC JPSoft et obtenir le même comportement que l'utilisation de CMD. J'utilise un programme .c droit, pas .cpp. Je ne vois aucun échec dans une seule version filetée. Je mets les sources et les binaires sur http://jcook.info/win7fail et le fichier zip MD5 est 579F4FB15FC7C1EA454E30FDEF97C16B et CRC32 est C27CB73D.
EDIT Après des suggestions, j'ai encore modifié le cas de test et toujours voir les échecs. Dans notre application actuelle, il y a des centaines de threads. Certains threads sortent avec divers codes de retour significatifs, certains sont exécutés pour toujours et certains sont bloqués dans les appels du système d'exploitation ou les DLL et sont difficiles (voire impossibles) à tuer.
#include "windows.h"
static unsigned __stdcall TestThread(void * unused)
{
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
CreateThread(NULL, 0, TestThread, NULL, 0, NULL);
return(250);
}
Si vous n'attendez pas l'ajout de votre thread une fois celui-ci terminé avant d'appeler ExitProcess()? – IanNorton
Vous devriez utiliser WaitForSingleObject() au lieu d'une boucle occupée pour attendre la fin du thread. En outre, renvoyez simplement 250 de WinMain() au lieu d'appeler directement ExitProcess(). Le code de démarrage du compilateur appellera ExitProcess() après la fermeture de WinMain(). –
@IanNorton: Je ne crois pas qu'il soit nécessaire d'attendre que les threads se terminent et/ou se rejoignent. Notre programme entier a des threads qui ne peuvent pas se terminer, soit en raison d'E/S bloquées ou d'appels système ou d'autres raisons. Y a-t-il une documentation de Microsoft sur laquelle vous pouvez me diriger et qui montre les exigences pour rejoindre des threads? @Remy: Notre programme actuel est beaucoup plus compliqué et il y a une raison pour le test direct. Comme il s'avère, supprimer toute mention de la variable Terminate ne résout pas le problème. c'est-à-dire un thread qui revient simplement et un WinMain qui crée le thread puis quitte échoue également. – piCookie