J'ai un programme Borland qui marchait très bien, mais qui ne marche plus sous Windows98. En cause, l'instruction GetOpenFileName(&ofn) qui renvoie l'erreur CDERR_STRUCTSIZE. Allons bon, qu'est ce que c'est ce bazar, pourtant je le définis tout à fait normalement:
L'alignement des structures est bon, c'est donc la définition même de cette structure qui a été modifiée. Je vais voir sa description dans commdlg.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part ofn.lStructSize = sizeof(OPENFILENAME);
Ah, je commence à comprendre, c'est le flag _WIN32_WINNT qui change la taille de la structure. Mais pourquoi il est à 0x0500 ? Je veux que mes programmes soient compatibles tous systèmes. Il est défini dans windows.h lequel est inclus dans vcl.h:
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 typedef struct tagOFNA { DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCSTR lpstrFilter; LPSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPSTR lpstrFile; DWORD nMaxFile; LPSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCSTR lpstrInitialDir; LPCSTR lpstrTitle; DWORD Flags; WORD nFileOffset; WORD nFileExtension; LPCSTR lpstrDefExt; LPARAM lCustData; LPOFNHOOKPROC lpfnHook; LPCSTR lpTemplateName; #ifdef _MAC LPEDITMENU lpEditInfo; LPCSTR lpstrPrompt; #endif #if (_WIN32_WINNT >= 0x0500) void * pvReserved; DWORD dwReserved; DWORD FlagsEx; #endif // (_WIN32_WINNT >= 0x0500) } OPENFILENAMEA, *LPOPENFILENAMEA;
Et là, je suis coincé: Si je le force à 0x400 (en le définissant en début de programme, par exemple) j'ai un million d'erreurs dans Windows.hpp, et si je le laisse, Openfilename ne marche plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #if defined(__BORLANDC__) # ifndef _WIN32_WINNT # define _WIN32_WINNT 0x0500 /* If not set, assume NT 5.00 */ # endif
Question 1: Comment faire ? Je veux dire proprement. Parce que je peux bien sûr faire comme ça:
et ça marche, mais je trouve ça très moche, et si cette structure est modifiée, il y en a surement d'autres dans le même cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ofn.lStructSize = sizeof(OPENFILENAME) - 12;
Question 2: Borland est-il compatible WIN9X ? Si oui, pourquoi ce define _WIN32_WINNT 0x0500 ?
Ah oui, ceux qui vont me dire "Tu n'a qu'à utiliser le composant TOpenDialog", je les invite dimanche à modifier les centaines d'ouverture de fichiers qu'il y a dans le source.
Partager