begin process at 2012 05 30 02:13:11
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

System

 > 

Problème avec GetOpenFileName


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème avec GetOpenFileName

lundi 13 juin 2011 à 10:33:01 | Problème avec GetOpenFileName

ArthurAuguste

Membre Club
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;
}
mardi 14 juin 2011 à 23:32:45 | Re : Problème avec GetOpenFileName

ArthurAuguste

Membre Club
Complément d'info.
Je suis allé sur un autre site où plusieurs personnes m'ont informé qu'elles avaient recopié mon mini programme et l'avaient exécuté chez elles sans aucun problème, même avec des gros fichiers. Ceci signifie, a priori, que mon mini programme est bon (j'aurais préféré le contraire). En conclusion, ma question n'est plus où ai-je fait une erreur de programmation ? Mais plutôt quelqu'un aurait-il un idée sur la raison pour laquelle ce mini programme se comporterait ainsi chez moi ?
J'ai la version Windows XP familiale SP3:
Version5.1 (numéro 2600.xpsp_sp3_gdr.101209-1647: Service Pack 3)
Merci
jeudi 30 juin 2011 à 09:30:24 | Re : Problème avec GetOpenFileName

ArthurAuguste

Membre Club
Le problème est élucidé, j'ai posté un message spécifique pour ça. Mais comme je ne le vois pas toujours apparaître dans la liste de mes messages postés, si vous ne le trouvez pas, veuillez m'en informer ici, je le reposterai.
A+


Cette discussion est classée dans : fichier, break, ofn, winmainkey, winclassmain


Répondre à ce message

Sujets en rapport avec ce message

API Win32, problème de variable [ par bouba ] Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source.LPSTR Path="";LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM CFileDialog [ par epoc ] J'ai un programme qui donne à l'utilisateur la possibilité d'enregistrer un fichier, via une boite de dialogue dont voici le code :CFileDialog m_SaveF Problème sauvegarde de fichier [ par sleeper41 ] Bonjour à tous!Voila j'essaie de sauvegarder un fichier txt bloc note sans passer par fichier enregister sous ect ..., mais j'ai quelque soucies.En fa [C++ / commdlg.h] Répertoire courant OPENFILENAME [ par GrosTony ] Salut @ tous,Dans le cadre d'un projet en cours, je doit gérer des enregistrements et chargement de fichier et je n'arrive pas à changer le répertoire probleme d'ouverture [ par catamenia ] bonjours, mon but est d'ouvrir un fichier.voici mon code :void CRobot1Doc::OnFileOpen()   {   CString c = "C:\\RobotEriccUsers\\";     CFileDialog tes Problème de manipulation de fichier [ par Mastersam ] Bonjour j'ai un problème de manipulation de fichier, voilà ce que j'utilise:char nomdufichier[MAX_PATH];struct FILE *fileproject;             OPENFILE 1 exe, même params, 2 résultats ! [ par Galmiza ] Salut, J'ai fait un programme qui visualise des fichiers de scenes 3D. Le chargement de la scene se fait ainsi.     g_pScene->LoadScene(strInputName OPENFILENAME [ par mat74 ] salut à tous, voila je voudrais ouvrir une boite dialogue pour enregistrer un fichier, récupérer la valeur de type, et rajouter un bouton suivant la v probleme dans la lecture d'un fichier [ par jack_ryan ] bonjour,voila je cherche a ouvrir un fichier bmp et mon code ne semble pas avoir accés a tout le fichier je m'en remet a vous pour savoir si cela est


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales