[Compatibilité] Borland, OPENFILENAME et _WIN32_WINNT
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:
Code:
ofn.lStructSize = sizeof(OPENFILENAME);
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:
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; |
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:
1 2 3 4
| #if defined(__BORLANDC__)
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0500 /* If not set, assume NT 5.00 */
# endif |
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.
Question 1: Comment faire ? Je veux dire proprement. Parce que je peux bien sûr faire comme ça:
Code:
ofn.lStructSize = sizeof(OPENFILENAME) - 12;
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.
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.