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

Langage C++ Discussion :

GetOpenFileName sur windows 7 x64


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut GetOpenFileName sur windows 7 x64
    Bonjour,

    ca fait deux jours que je me penche sur le problème de GetOpenFileName sous Visual Studio wundows 7 x64.


    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
     
    BOOL ShowOpenFileDlgImg(HWND hwnd, TCHAR *pstrFileName, TCHAR *pstrTitleName)
    {
    	TCHAR *szFilter		=  "JPEG Files (*.jpg)\0*.jpg\0PNG Files (*.png)\0*.png\0GIF Files (*.gif)\0*.gif\0BMP Files (*.bmp)\0*.bmp\0\0";
     
    	OPENFILENAME ofn; //	= { sizeof(ofn) };
     
    	ZeroMemory(&ofn, sizeof(OPENFILENAME));
        ofn.lStructSize = sizeof(OPENFILENAME);
     
    	ofn.hwndOwner		= hwnd;
    	ofn.hInstance		= GetModuleHandle(0);
    	ofn.lpstrFilter		= szFilter;
    	ofn.lpstrFile		= pstrFileName;
    	pstrFileName[0]='\0';
    	ofn.lpstrFileTitle	= pstrTitleName;
     
    	ofn.nFilterIndex	= 1;
    	ofn.nMaxFile		= _MAX_PATH;
    	ofn.nMaxFileTitle	= _MAX_FNAME + _MAX_EXT; 
     
    	// flags to control appearance of open-file dialog
    	ofn.Flags			=	OFN_EXPLORER			| 
    							OFN_ENABLESIZING		|	
    							OFN_PATHMUSTEXIST		|
    							OFN_FILEMUSTEXIST;
     
    	return GetOpenFileName(&ofn);
    }
    j'ouvre une boite de sélection de fichier images pour pouvoir l'afficher sur une fenetre mais j'ai tout essayé et ca ne fonctionne pas. en faisant des recherche j'ai pu constaté que beaucoup de gens avait se problème mais aucune solution n'est donné.

    si je code en dur le nom du fichier pstrFileName a l'aide d'un strcopy_s et que je commente tout le code, ca fonctionne.

    donc c'est bien au niveau de cette fonction, pourtant tout est bien codé.

    J'ai essayé de mettre hwndOwner a NULL, j'ai tenté ofn.lpstrFile[0]='\0'.

    Est ce que quelqu'un à déjà résolut ce problème ?

    Merci de votre aide.

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Quand tu dis que ça ne fonctionne pas, tu entends quoi par là ?
    En particulier, si GetOpenFilename() retourne zéro, tu es encouragé à appeler la fonction CommDlgExtendedError() pour avoir plus d'informations sur l'erreur rencontrée.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    en utilisant CommDlgExtendedError ca renvoi 0, le fichier est bien stockée dans la variable pstrFileName.

    quand j'ouvre la boite de dialogue, sur la sortie dans le débug j'ai:

    Exception de première chance à 0x75f1c41f (KernelBase.dll) dans monprog.exe*: 0x000006BA: Le serveur RPC n’est pas disponible.

    j'ai d'autres boites de dialogue qui permet de charger des fichiers .txt et ca fonctionne.

    Je confirme que ca viens bien de getopenfilename, si je le met en commentaire , je n'ai pas d'exception et la suite du programme fontionne parfaitement si je code en dur un nom de fichier.

    quand je dis que ca ne fonctionne pas, c'est qu'il ne se passe rien apres avoir sélectionné mon le fichier image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(ShowOpenFileDlgImg(hwnd, szFileName, szFileTitle))
    			{		
    				InitComboFilter();
    				DoOpenFileImage(hwnd, szFileName, szFileTitle);				
    			}
    Si je met en commentaire ShowOpenFileDlgImg, DoOpenFileImage affiche bien l'image, si je code en dur un nom de fichier au lien de la variable szFileName.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour ton erreur de Debug, je vois deux pistes à explorer:
    • Désactiver le débogage RPC dans les options de Visual: Cette option cause des problèmes.
    • As-tu pensé à appeler CoInitialize() avant l'appel à GetOpenFileName()?

    Ensuite, simplifie ton appel un peu, pour réduire la liste des facteurs d'erreurs potentiels: Mets hInstance à NULL (il n'est pas nécessaire dans le cas présent, d'après la doc), ainsi que lpstrFileTitle (qui est optionnel).

    Poste aussi l'appel à la fonction.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Je n'ai jamais utilisé la fonction CoInitialize avant un GetOpenFileName mais je vais me pencher la dessus, pour le paramètre au niveau du débogage, c'est dans les propriétés de Configuration et Debogage ? car je n'ai pas trouvé cette option.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Menu Tools -> Options -> Debugging -> Native -> Checkbox "Enable RPC Debugging" (je viens de vérifier sous Visual 2008).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    RPC etait decoché,
    J'ai ajouté CoInitialize(NULL); en début du WinMain et CoUninitialize(); à la fin du WinMain, ca ne change rien.


    si j'appel la fonction de cette manniere avec biensur le handle de la fenetre qui convient, ca fonctionne mais des que c'est un parametre ca ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OpenFileImage(hwnd, "D:\\image.jpg");

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Sur un bouton test, la fonction OpenFileImage fonctionne tres bien, mais en ajoutant l'ouverture d'une boite de sélection de fichier ca ne fonctionne pas:

    Ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TextView_ToolsTest(g_hwndTextView, g_hwndTextView, "d:\\image.jpg");
    Ceci ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(ShowOpenFileDlgImg(hwnd, szFileName, szFileTitle))
    {
    TextView_ToolsTest(g_hwndTextView, g_hwndTextView, szFileName);	
     
    }
    Donc je confirme que ca viens de GetOpenFileName.

    j'ai toujours cette erreur lors de l'ouverture de la boite de dialogue de sélection de fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Exception de première chance à 0x748dc41f (KernelBase.dll) dans monprog.exe*: 0x000006BA: Le serveur RPC n’est pas disponible.
    J'ai essayée le programme sur un autre PC, ca ne marche pas non plus.

    Il y a un conflit quelque part au niveau mémoire peut être, par contre je ne vois pas le rapport avec RPC, pour les objets COM sans doute?.

    TextView_ToolsTest est une macro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define TextView_ToolsTest(hwndTV, hwnd, szFile) \
    	SendMessage((hwndTV), TXM_TOOLSTEST, (WPARAM)(hwnd), (LPARAM)(szFile))
     
     
    case TXM_TOOLSTEST:		
    		return OnToolsTest((HWND)wParam, (TCHAR *)lParam);
    OnToolsTest:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BOOL TextView::OnToolsTest(HWND hwnd, TCHAR * szFile)
    {			
    	OpenFileImage(hwnd, szFile);
    	return 0;
     
    }
    Merci de votre aide.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    En ajoutant la ligne suivante au début du WinMain comme disait Medinoc ca fonctionne, je n'avais pas mis la bonne syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    HRESULT hr =:: CoInitializeEx (0, COINIT_MULTITHREADED);
     
    	if (FAILED(hr))
        {
    		MessageBox(NULL, "Failed to initialize COM library.", "Chatlog", MB_ICONERROR); 
            return 1;              // Program has failed.
        }
    et à la fin du WinMain

    Merci.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    COINIT_MULTITHREADED? Normalement les trucs basés sur Explorer (comme les OPENFILENAME) utilisent le défaut, COINIT_APARTMENTTHREADED...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par andromeda Voir le message
    j'ai d'autres boites de dialogue qui permet de charger des fichiers .txt et ca fonctionne.
    Cette phrase, et celle de Médinoc sur le fait qu'Explorer ne devrait pas nécessiter COINIT_MULTITHREADED, me laissent perplexe.
    Je sais que le topic est marqué comme résolu, mais j'ai juste une question :
    est-ce que la boîte de dialogue de tes fichiers txt s'ouvrent par défaut dans le même répertoire que celle qui permet de choisir des fichiers JPEGs ?

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Oui en effet la boite de dialogue de sélection de fichier s'ouvre par défaut dans le même répertoire que celle qui permet de choisir des fichiers JPEGs l'inverse aussi.
    Je n'ai pas testé avec COINIT_APARTMENTTHREADED, devrais je utiliser ce paramètre?

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    ca ne fonctionne pas avec le paramètre COINIT_APARTMENTTHREADED, meme problème décrit sur mes posts précédents.

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu dois avoir quelque chose qui initialise déjà COM en multi-threaded, alors. Je parie que CoInitialize(COINIT_APARTMENTHREADED) échoue avec la valeur RPC_E_CHANGED_MODE (0x80010106).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Dans un des fichier sources de mon prog, j'utilise CoInitialize(0) pour afficher une boites de propriétés avec des onglets:

    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
     
    PROPSHEETHEADER psh    = {   sizeof(psh)   };
    	PROPSHEETPAGE   psp[3] = {  { sizeof(psp[0]) },  
    								{ sizeof(psp[1]) }, 
    								{ sizeof(psp[2]) }, 
    								//{ sizeof(psp[3]) },
    							};
     
    	CoInitialize(0);
     
    	// configure property sheet
    	psh.dwFlags			= PSH_PROPSHEETPAGE;
    	psh.hwndParent		= hwndParent;
    	psh.nPages			= sizeof(psp) / sizeof(psp[0]);
    	psh.ppsp			= psp;
    	psh.pszCaption		= _T("Options");
     
    	// configure property sheet page(1)
    	psp[0].dwFlags		= PSP_USETITLE;
    	psp[0].hInstance	= GetModuleHandle(0);
    	psp[0].pfnDlgProc	= FontOptionsDlgProc;
    	psp[0].pszTemplate	= MAKEINTRESOURCE(IDD_FONT);
    	psp[0].pszTitle		= _T("Font");
     
    	// configure property sheet page(2)
    	psp[1].dwFlags		= PSP_USETITLE;
    	psp[1].hInstance	= GetModuleHandle(0);
    	psp[1].pfnDlgProc	= DisplayOptionsDlgProc;
    	psp[1].pszTemplate	= MAKEINTRESOURCE(IDD_DISPLAY);
    	psp[1].pszTitle		= _T("Display");
     
    	// configure property sheet page(3)
    	/*psp[2].dwFlags		= PSP_USETITLE;
    	psp[2].hInstance	= GetModuleHandle(0);
    	psp[2].pfnDlgProc	= MiscOptionsDlgProc;
    	psp[2].pszTemplate	= MAKEINTRESOURCE(IDD_OPTIONS);
    	psp[2].pszTitle		= _T("Settings");*/
     
    	// configure property sheet page(4)
    	psp[2].dwFlags		= PSP_USETITLE;
    	psp[2].hInstance	= GetModuleHandle(0);
    	psp[2].pfnDlgProc	= ServerOptionsDlgProc;
    	psp[2].pszTemplate	= MAKEINTRESOURCE(IDD_SERVER);
    	psp[2].pszTitle		= _T("Server");
     
    	if(PropertySheet(&psh))
    	{
    		ApplyRegSettings();		
    	}
     
    	CoUninitialize();
    }
    peut être est ce cela.

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

Discussions similaires

  1. php_interbase pour [php 5.3.5] VC6 x64 sur [Windows]
    Par guence dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 24/04/2011, 16h57
  2. [Oracle] Connexion PHP 5.2.5 / Oracle10 g sur Windows server2003 x64
    Par Sunchaser dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 29/10/2008, 15h40
  3. pb d'installation d'Oracle 9 sur windows 2000
    Par condor dans le forum Oracle
    Réponses: 1
    Dernier message: 14/12/2006, 11h40
  4. pb d'installation d'Oracle 9 sur windows 2000
    Par condor dans le forum Oracle
    Réponses: 1
    Dernier message: 14/06/2006, 14h28
  5. [Utilisation Postgresql sur windows]
    Par xhercule dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/01/2004, 18h36

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