IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Problème avec GetOpenFileName


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Problème avec GetOpenFileName
    Bonjour,
    J’ai un problème avec GetOpenFileName si et seulement si le fichier que j’ouvre fait plus de 93Ko !!!! La première fois que je l’ouvre en général tout se passe bien, j’arrive sur mon 2ème message, je clique sur « OK » et tout continue normalement, si je le ferme et qu’ensuite j’essaie de le réouvrir, le 1er message s’affiche normalement, je clique sur « OK », GetOpenFileName s’exécute : je choisis le même fichier (ou un autre >93Ko) , le 2ème message s’affiche, mais avant que j’ai eu le temps de cliquer sur « OK », il s’efface et le programme disparaît du Gestionnaire de tâches !!!!! très bizarre. Aucun problème si le fichier est d’une taille inférieure à 93Ko et je ne vois aucun lien avec cette taille de fichier saugrenue !!!
    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
    case IDM_OPEN:
    	*** choix du Fichier à ouvrir
    	ZeroMemory(&ofn, sizeof(OPENFILENAME));
    	*cheminfile=0x0;
    	ofn.lStructSize = sizeof(OPENFILENAME);
    	ofn.hwndOwner = winmainkey;
    	ofn.lpstrFile = cheminfile;
    	ofn.nMaxFile = Tailchemin;
    	ofn.lpstrFilter = "Tous les fichiers (*.*)\0*.*\0\0";
    	ofn.nFilterIndex = 1;
    	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    	Messages("1", "je passe", XOK); // pas de pb jusqu’ici !!! **************
    	if (GetOpenFileName(&ofn)==false) break;
    	Messages("2", "je passe", XOK); // pb si fichier > 93 Ko ????????? *************
    	keyfile = CreateFile(cheminfile,  GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL);
    	sizebyte=GetFileSize(keyfile, NULL);
    	ReadFile(keyfile, Bloc, nbbytetoread, &nbbyteread, NULL);
    	SendMessage(winmainkey, WM_PAINT, 0, 0);
    	break;
    case IDM_CLOSE:
    	CloseHandle(keyfile);
    	SendMessage(winmainkey, WM_PAINT, 0, 0);
    	break;

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Normalement tu dois fermer keyfile avant d'ouvrir un autre fichier, chose que tu ne fais pas parce que tu ne fermes keyfile qu'au moment où l'on quitte l'application. Et est-ce que Bloc est assez grand pour contenir le fichier lu ? Dans tous les cas, ce serait aussi mieux que Bloc soit alloué avec malloc plutôt que de manière static. Et SendMessage( ... WM_PAINT ...), ça se fait pas. C'est InvalidateRect qu'il faut appeler. Enfin, ton code est trop incomplet pour qu'on puisse connaître de manière sûre la cause du problème. Poste donc le code complet.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut GetOpenFileName problème
    Bon, il va falloir que je prévois une rémunération pour Melem...
    Mon code fait pour l'instant 1060 lignes, ça m'est un peu difficile de le poster ici. En fait mon code marchait très bien jusqu'à présent, c'est par hasard en utilisant en entrée un fichier plus gros que d'habitude que je me suis aperçu du problème, j'ai alors essayé de grossir progressivement la taille du fichier d'entrée pour voir à partir de quand ça se produisait et c'est à partir de 93Ko ! Mon code fait plusieurs choses comme par exemple rechercher une séquence ASCII ou hexa dans un fichier et la remplacer par une autre, mais il fait ceci à la demande de l'utilisateur, mais dans la séquence que j'ai postée je ne fais presque rien, j'ouvre le fichier et je lis le premier bloc de 1024 octets, c'est tout, je ne cherche pas à lire tout le fichier (pour lire plus loin c'est l'utilisateur qui doit le demander), le WM_PAINT affiche le contenu du bloc dans la fenêtre en ASCII sur la partie gauche, en HEXA sur la partie droite. Mais comme je l'ai indiqué dans mon précédent message ça plante avant d'arriver à l'appel de WM_PAINT. Pour répondre à ta remarque, je ferme bien keyfile sans quitter l'application, le IDM_CLOSE (ça n'est pas un WM_CLOSE) est appelé par l'utilisateur lorsqu'il clique sur "Fermer le fichier", seul le fichier est fermé, l'utilisateur peut ensuite en cliquant sur "Ouvrir" ouvrir n'importe quel autre fichier ou bien le même. Et encore une fois avec un fichier <93Ko je peux l'ouvrir, lire le 1er bloc, le fermer le réouvrir autant de fois que je veux sans aucun problème et évidemment poursuivre la suite du programme (ce que je ne fais même pas dans l'exemple donné) c'est à dire remplir toutes les fonctionnalités prévues. Et ce qui est tout à fait bizarre c'est que le Message n°2 que j'ai mis pour debogguer s'affiche puis disparaît avant que j'ai eu le temps de cliquer dessus alors que jusqu'à aujourd'hui j'avais compris que MessageBox était bloquant il devait attendre l'intervention de l'utilisateur !!!!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut GetOpen FileName complément
    Ce qui me semble important de rajouter c'est que je ne vois aucun rapport entre ce que je fais et la taille du fichier. Etant donné que dans la séquence incriminée qui est en fait le début du programme je ne fais qu'ouvrir et lire un 1er bloc de 1024 octets (par clic sur un bouton "Ouvrir"), puis fermer aussitôt le fichier (par clic sur le bouton "Fermer"). Je ne vois pas comment la taille du fichier peut intervenir là-dedans, d'autant que 93Ko ça n'est pas une taille énorme!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Complément de complément
    En fait tout se passe comme si une autre tâche de fond, autre que celle sur laquelle je crois être, se déroulait en parallèle et se plantait. Pendant que le déroulement de mes instructions arrive sur mon 2ème message sur lequel le déroulement devrait se bloquer (puisqu'il n'est autre qu'un MessageBox qui devrait attendre le clic sur OK), c'est comme si une autre tâche s'exécutait en parallèle, j'ai pensé au WM_PAINT, mais je ne l'ai pas encore appelé et de plus comme quelle que soit la taille du fichier je ne travaille dans cette étape là que sur le premier Bloc de 1024 octets je ne vois pas pourquoi le WM_PAINT se déroulerait différemment puisque le buffer de 1024 est identique. J'ai pensé aussi au ReadFile qui continuerait en parallèle, alors que je n'ai demandé que 1024 octets, et là il pourrait dans ce cas y avoir un lien, certes obscur, avec la taille du fichier.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut complément de complément de complément
    Pour continuer à investiguer, j'ai fait l'essai de totalement enlever le case WM_PAINT de ma fenêtre principale pour le mettre hors de cause et ça ne change rien au résultat, toujours 90% de plantage sur fichiers > 93Ko. Par contre je viens de remarquer un truc, mais je ne vois pas trop ce que je peux en tirer, si dans la construction de la structure OPENFILENAME j'enlève la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    //
    et que lors de l'exécution je coche la case "read only" j'inverse les cas de plantage, ça ne plante plus que dans 10% des cas pour les fichiers >93Ko !!!

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Franchement, je pense que tu as un problème ailleurs. La fonction GetOpemFileName() fonctionne quelle que que soit la taille du fichier ouvert.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Réponse
    Je le pense aussi, mais après avoir rajouté des pièges un peu partout je n'arrive pas à mettre le problème en évidence, aussi je vais écrire un petit programme élémentaire tout simple qui fait la même chose, ainsi je pourrai revenir ici avec le code complet si le problème continue.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Programme élémentair complet
    Je pense maintenant que 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 même 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 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, ci-dessous le petit programme :
    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
    #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;
    }

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Fin
    Voir une solution de contournement du problème dans la discussion: "GetOpenFileName pour les sceptiques"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-MAC 2011] Problème avec GetOpenFilename
    Par compag dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/03/2015, 14h20
  2. [XL-2003] Problème avec la fonction GetOpenFilename
    Par johannj dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/06/2009, 17h26
  3. Problème avec Application.GetOpenFilename
    Par csmaf2002 dans le forum VB.NET
    Réponses: 1
    Dernier message: 27/02/2008, 09h15
  4. Problème avec ma fonction GetOpenFileName ()
    Par NoritakaRomain dans le forum Windows
    Réponses: 5
    Dernier message: 03/05/2007, 11h52
  5. [VBA-E] & problème avec GetOpenFileName
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/03/2006, 17h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo