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 :

A propos de 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 A propos de GetOpenFileName
    Bonjour,
    Existe-t-il une autre fonction que GetOpenFileName quand on veut que la sélection s’arrête à un répertoire (n’aille pas jusqu’à la sélection du fichier) ou bien faut-il programmer la structure OPENFILENAME avec des paramètres différents et si oui lesquels ?
    Concernant mon autre question dans ce forum sur mon problème avec GetOpenFileName, pour ceux qui sont intéressés, aller directement à la réponse n° 8, j’ai donné un micro programme complet qui met le phénomène en évidence.

  2. #2
    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 Fonction parcourir
    Re-bonjour,
    Bon concernant la fonction qui permet de sélectionner un répertoire, en parcourant l'API Windows, j'ai fini par trouver, c'est:
    SHBrowseForFolder()
    Je l'ai utilisée, par contre à l'adresse browse.pszDisplayName (de BROWSEINFO browse) je ne récupère que le nom du dernier répertoire, si quelqu'un pouvait m'indiquer comment récupérer tout le chemin qui mène à ce répertoire choisi, ça m'aiderait bien. Merci.
    Concernant le problème avec GetOpenFileName je reposte ici le micro-programme complet qui permet de mettre le malfonctionnement en évidence:
    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 (très curieux car MessageBox est bloquant). Je serais ravi d'avoir fait une erreur de programmation et que vous trouviez la faille, ci-dessous le petit programme (Merci):
    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;
    }

  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 Complément d'info
    Re-re-bonjour,
    Concernant la fonction SHBrowseForFolder() et la récupération du chemin complet du répertoire choisi, c'est réglé, ne cherchez plus. Concernant le problème avec GetOpenFileName c'est beaucoup plus embêtant:
    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

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 385
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 385
    Points : 20 463
    Points
    20 463
    Par défaut
    Citation Envoyé par Athur Voir le message
    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 (très curieux car MessageBox est bloquant). Je serais ravi d'avoir fait une erreur de programmation et que vous trouviez la faille, ci-dessous le petit programme (Merci):

    tu déclares un tableau static de 1024 octets pour lire le fichier ; attention si le fichier est affiché comme étant égal à 1024 octets ou moins en réalité il fait peut-être plus sur disque..
    il faut utiliser la fonction GetFileAttribute() qui va te donner la taille exacte du fichier et allouer un tampon pour la lecture avec malloc ou new

  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 GetOpenFileName (suite)
    Bonjour,
    Merci pour la réponse, mais excuse-moi, je ne comprends pas la réponse ou alors je n'ai rien compris à la fonction ReadFile et pourtant je l'utilise souvent.
    Tu me dis: attention ton fichier fait peut-être plus de 1024 octets!!!
    Je réponds: il fait toujours plus de 1024 octets, puisque si tu lis bien mes précédents messages, ceux que j'appelle petit fichiers ce sont des fichiers d'environ 75Ko (donc >1024 octets) et ceux que j'appelle plus gros fichiers c'est à partir de 93 Ko jusqu'à plus de 1 Mo (donc toujours > 1024 octets).
    Et je ne vois pas en quoi ça gêne que mes fichiers fassent tous plus de 1024 octets puisque avec la fonction ReadFile je ne demande qu'à en lire 1024 et en plus une seule fois (les 1024 premiers). Ou alors je n'ai rien compris à ReadFile.
    Par ailleurs ceci n'expliquerait pas pourquoi je n'ai aucun problème avec les "petits" fichiers d'environ 75Ko (> 1024 octets). Enfin comme je le précise dans mon dernier message, sur un autre site plusieurs personnes ont recopié tel que le petit programme que j'ai posté (donc avec le buffer de 1024 en static) et aucun n'a le problème. Ce même programme marche chez eux dans tous les cas, petits ou gros fichiers.
    Je renouvelle donc ma question quelqu'un aurait-il une idée sur la raison pour laquelle, chez moi ce programme se comporterait ainsi ?
    Si je me suis trompé dans mon raisonnement, je te remercie de bien vouloir me corriger.
    Merci

  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 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. Réponses: 2
    Dernier message: 19/03/2009, 11h46
  2. A propos depth buffer
    Par j.yves dans le forum DirectX
    Réponses: 1
    Dernier message: 03/12/2002, 00h41
  3. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22
  4. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  5. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18

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