Bonjour,
J’ai un problème avec GetOpenFileName si et seulement si le fichier que j’ouvre fait plus de 93Ko !!!! Si j’ai fait une erreur de programmation vous allez pouvoir la trouver très vite car j’ai réécris un programme élémentaire très simple et très court qui reproduit exactement le phénomène et vous en trouverez le code complet ci-dessous.
Ce programme est une simple fenêtre avec deux boutons (un bouton "Ouvrir" et un bouton "Fermer") Le bouton "Ouvrir" (case 1 ) appelle la fonction GetOpenFileName pour choisir un fichier quelconque, puis ouvre le fichier avec CreateFile, puis lit un premier bloc de 1024 bytes avec ReadFile et c’est tout. Le bouton "Fermer" (case 2) permet de fermer le fichier qui vient d’être ouvert. Vous pouvez recopier ce code, le jeu consiste à faire l’expérience en choisissant un premier fichier d’environ 75Ko, vous l’ouvrez avec le bouton Ouvrir, puis vous le fermez avec le bouton "Fermer" et vous recommencez plusieurs fois avec le même fichier : Ouvrir, Fermer, etc… ceci sans jamais cliquer sur la croix pour fermer la fenêtre, vous constaterez qu’il n’y a aucun problème, tout marche très bien. Puis vous recommencez en choisissant cette fois-ci un fichier d’environ 1 Mo (>93Ko c’est suffisant, mais avec 1Mo ça va plus vite), vous allez constater à un moment (ou même souvent dès le premier essai) que le message 2 s’affiche puis disparaît tout seul en même temps que la fenêtre. Je serais ravi que vous trouviez la faille car je ne vois pas de rapport avec la taille du fichier puisque dans tous les cas je ne lis que le 1er bloc, ci-dessous le petit programme :
#include <windows.h>
LRESULT CALLBACK processmainmess( HWND, UINT, WPARAM, LPARAM);
HINSTANCE n0instance;
MSG message;
OPENFILENAME ofn;
int APIENTRY WinMain( HINSTANCE W_n0inst, HINSTANCE W_n0precinst, LPTSTR W_CmdLine, int W_cdeaffich) // entier signé (32 bits)
{
n0instance = W_n0inst;
WNDCLASS winclassmain;
winclassmain.hInstance = n0instance;
winclassmain.lpszMenuName = NULL;
winclassmain.lpszClassName = "Essai";
winclassmain.hIcon = NULL;
winclassmain.hCursor = LoadCursor(NULL,IDC_ARROW);
winclassmain.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);
winclassmain.style = CS_VREDRAW | CS_HREDRAW;
winclassmain.lpfnWndProc = (WNDPROC)processmainmess;
winclassmain.cbWndExtra = 0;
winclassmain.cbClsExtra = 0;
if ( !RegisterClass( &winclassmain ) )
return( FALSE );
//
HWND Hdlgmain = CreateWindow("Essai", "test", WS_CAPTION | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 250, 100, NULL, NULL, n0instance, NULL);
if ( !Hdlgmain ) return( FALSE );
ShowWindow( Hdlgmain, W_cdeaffich ); // lancement manuel
UpdateWindow( Hdlgmain ); //
while(GetMessage( &message, NULL, 0, 0))
{
TranslateMessage( &message );
DispatchMessage( &message );
}
return message.wParam;
}
LRESULT CALLBACK processmainmess( HWND winmainkey, UINT IDMsg, WPARAM wParam, LPARAM lParam )
{
static HANDLE keyfile;
CHAR cheminfile[256];
static BOOL fileexist;
DWORD nbbytetoread=1024;
DWORD nbbyteread;
static CHAR Bloc[1025];
switch(IDMsg)
{
case WM_CREATE :
CreateWindow("BUTTON", "Ouvrir", WS_CHILD | WS_VISIBLE | WS_BORDER, 0, 0, 100, 35, winmainkey, (HMENU)1, n0instance, NULL);
CreateWindow("BUTTON", "Fermer", WS_CHILD | WS_VISIBLE | WS_BORDER, 110, 0, 100, 35, winmainkey, (HMENU)2, n0instance, NULL);
fileexist=false;
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 1: // clic sur bouton ouvrir un fichier
if(fileexist) {MessageBox(winmainkey, "Fichier déjà ouvert", "test", MB_OK); break;}
// *** choix du Fichier à ouvrir
ZeroMemory(&ofn, sizeof(OPENFILENAME));
*cheminfile=0x0;
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = winmainkey;
ofn.lpstrFile = cheminfile;
ofn.nMaxFile = 256;
ofn.lpstrFilter = "Tous les fichiers (*.*)\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
//
MessageBox(winmainkey, "1", "je passe", MB_OK); // ************* piège message 1
if (GetOpenFileName(&ofn)==false) break;
MessageBox(winmainkey, "2", "je passe", MB_OK); // ************* piège message 2
//
keyfile = CreateFile(cheminfile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
fileexist=true;
ReadFile(keyfile, Bloc, nbbytetoread, &nbbyteread, NULL);
MessageBox(winmainkey, "Fichier ouvert et 1er bloc lu OK", "test", MB_OK);
break;
case 2: // clic sur bouton fermer le fichier déjà ouvert
if(!fileexist) {MessageBox(winmainkey, "Il n'y a pas de fichier ouvert", "test", MB_OK); break;}
CloseHandle(keyfile);
fileexist=false;
MessageBox(winmainkey, "Fichier fermé OK", "test", MB_OK);
break;
}
break;
case WM_CLOSE :
DestroyWindow( winmainkey );
break;
case WM_DESTROY :
if(fileexist) CloseHandle(keyfile);
PostQuitMessage(0);
break;
case WM_QUERYENDSESSION :
DestroyWindow( winmainkey );
break;
default :
return DefWindowProc( winmainkey, IDMsg, wParam, lParam );
};
return 0;
}