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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    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 confirmé
    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 : 39
    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
    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 confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    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 confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    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 confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    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 confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    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 !!!

+ 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