Bonsoir tout le monde,
J'ai un problème dont je n'ai pas trouvé de solutions ...
J'ai fait un programme, il marche très bien, et aujourd'hui je l'ai envoyé à quelqu'un. Ce quelqu'un me répond "Il ne marche pas ton programme", je lui demande "Qu’est-ce qu'il t'affiche ?" et il me répond "Rien, ça fait juste le son 'toung' d'erreur de Windows". Je trouve ça bizarre, j'essai donc mon programme sur plusieurs PC chez moi, et résultat des courses, il marche bien sur deux PC et ne marche pas sur deux autres PC. Je ne vois pas ce qu’ils peuvent avoir en commun.
Donc, je pars sur un PC sur lequel le problème est reproductible, j'y mets un EDI, et je trouve que sans le fichier manifest, mon programme marche bien.
Ensuite, je me dis qu'il y a quelque chose dans mon code qui rentre en conflit avec le manifest, donc j'essai d'enlever bout par bout tout le contenu de mon programme. C'est passé par un stade où à la place de faire un son sans rien afficher, ça affichait juste une fenêtre avec sa couleur de fond, mais pas tout ce qu'il devait y avoir dedans (boutons, editboxs, ...). A la fin, j'ai tout enlevé sauf un bouton, et le problème persistait ...
J'ai donc commencé à douté de mon code et du fichier manifest, donc pour écarter ses hypothèses, j'ai pris un petit programme qui marchais bien sur ce PC, j'en aie extrait le fichier manifest, et j'ai vérifié sur internet, c'est bien la même chose que ce que l'on donne dans les tutos ou sur le site de Microsoft.
Donc avec ça, le problème ne peut plus venir du fichier manifest en lui-même.
Ensuite, j'ai fait un nouveau projet de programme en fenêtre avec mon EDI, CodeBlocks, et donc il y a déjà dedans un bout de code pour pouvoir afficher une fenêtre, j'y ais juste ajouté un simple bouton et je l'ai compilé, il m'affiche une fenêtre avec un bouton, jusque là normale, et j'essai avec le manifeste en le mettant dans le répertoire de l'exe avec le même nom que l'exe+.manifest, comme ça, ça exclut aussi un problème de ressources.
Et donc avec ce teste, même symptômes qu'avec mon programme, pas de manifeste, le bouton s'affiche, avec le manifeste, la fenêtre s'affiche vide.
Donc, pour résumer :
- le manifeste est bon, c'est sûr, je l'ai testé avec un autre programme est il marche sans le faire planter,
- je ne pense pas qu'il y ait de problème dans le code donné par l'IDE CodeBlocks,
- je ne pense pas que ça vienne des PCs, parce que le problème a put être reproduit sur trois PCs, et que sur ces PC là, les autres programmes qui contiennent des manifestes marchent très bien.
J'ai pensé sans trop y croire que ça pouvais venir du compilateur, puisque j'utilisais une version de MinGW "Candidate", en mettant une autre version, ça n'a rien changé.
Finalement, j'ai regardé ce que renvoyais GetLastError(), et la j'ai eut un truc auquel je ne m'attendais pas du tout :
- GetLastError renvois 2 juste au début de la fonction d'entrée WinMain, soit "The system cannot find the file specified." (pas bien compris pourquoi)
- GetLastError renvois 1400 juste après l'appel à CreateWindow pour la création de la fenêtre, soit "Invalid window handle."
Donc, là je suis complètement dépassé ...
Qu'en pensez-vous ?
Quels outils me permettraient de diagnostiquer le problème plus finement ?
Je vous mets ci-dessous le code de teste ainsi que le contenu du fichier manifeste.
Merci de vous être penché sur mon problème.
A+, Pierre.
Le code donné par l'EDI CodeBlocks avec l'ajout d'un bouton et de ce qu'il faut pour voir quelle erreur est renvoyé :
PS : Sachant que sans le manifest, ce bout de code marche très bien.
Le contenu du fichier manifest qui marche puisque sur d'autres programmes, il ne les fait pas planter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124 #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "CodeBlocksWindowsApp"; HINSTANCE instance; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { if (GetLastError()) { // => renvoit 2 si manifest exit(GetLastError()); } else { MessageBox(NULL, "OK", "Info", MB_OK); } instance=hThisInstance; HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Code::Blocks Template Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); if (GetLastError()) { // => renvoit 1400 si manifest exit(GetLastError()); } else { MessageBox(NULL, "OK", "Info", MB_OK); } /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: CreateWindow("BUTTON", "Bouton ...", WS_CHILD | WS_VISIBLE, 145, 159, 149, 22, hwnd, 100, instance, NULL); return 0; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.2" processorArchitecture="x86" name="Carlos Domingo Mas.Choli.msg6_id" type="win32" /> <description>MSN Messenger id number</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="X86" publicKeyToken="6595b64144ccf1df" language="*" /> </dependentAssembly> </dependency> </assembly>
Partager