MFC : CFileDialog

MFC : CFileDialog - C++ - Programmation

Marsh Posté le 30-05-2006 à 10:09:24    

Salut la suite du problème :
 
j'ai un assert avec un CFileDialog sur un problème de ressource (ASSERT(afxCurrentResourceHandle != NULL)).
J'ai cherché un peu et  
CWnd* mainWnd = AfxGetMainWnd(); me donne quelque chose d'indéfini, en rentrant dans AfxGetMainWnd(), je me rend compte que CWinThread* pThread = AfxGetThread(); me donne aussi quelque chose d'indéfini.
 
Je crée mon CFileDialog ainsi :  
 
CFileDialog fileDlg (TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST, strFilter, mainWnd );
strFilter étant un Cstring pour le filtre ..
 
Si vous avez une idée je vous remercie bien.
 
l'ancien :  
------------------------------------------------------------------------------
Salut,
j'ai une application win32 MFC sur laquelle j'ai ajouté un CFileDialog.
Mon problème est que suivant la taille des noms de fichiers donnés, parfois il y a tronquage, et donc le fichier ne peut pas être ouvert ...
Y'a-t il une limite différente entre ce que "permet" Windows et ce qu'accepte les MFC ?
 
Merci bien @VS2003


Message édité par gee le 06-06-2006 à 15:07:12
Reply

Marsh Posté le 30-05-2006 à 10:09:24   

Reply

Marsh Posté le 01-06-2006 à 00:07:11    

up

Reply

Marsh Posté le 01-06-2006 à 13:11:12    

Tronquage, c'est-à-dire ? quel est exactement le problème ?
CFileDialog n'est qu'une encapsulation de OpenFileDialog je crois, donc il n''y a aucune raison qu'il y ait un changement.

Reply

Marsh Posté le 01-06-2006 à 13:25:56    

Bah mon nom de fichier passe par exemple de  
 
monnomdefichierquiesttroplong.monextension
à
monnomdefich
 
bon bien sûr là il y a mois de char mais c'est pour l'exemple.
 
Merci

Reply

Marsh Posté le 02-06-2006 à 16:58:35    

up

Reply

Marsh Posté le 03-06-2006 à 11:46:05    

Ah oui ça m'est arrivé aussi pour la sélection multiple
 
Je réponds de tête.
 
il faut changer le buffer destiné à recevoir les fichiers sélectionnés. Ca se passe dans la structure publique CFileDialog::m_ofn. C'est un OPENFILENAME de l'API Win 32.
 
Dans la structure OPENFILENAME, il me semble qu'il faut changer la valeur des champs :
 

Citation :

lpstrFileTitle
    Pointer to a buffer that receives the file name and extension (without path information) of the selected file. This member can be NULL.
 
nMaxFileTitle
    Specifies the size, in TCHARs, of the buffer pointed to by lpstrFileTitle. For the ANSI version, this is the number of bytes; for the Unicode version, this is the number of characters. This member is ignored if lpstrFileTitle is NULL.


 
Par défaut le buffer fait _MAX_PATH de longueur.


Message édité par slash33 le 03-06-2006 à 11:52:11
Reply

Marsh Posté le 03-06-2006 à 12:31:45    

Merci je regarderai cela lundi.
Sinon hier j'ai cherché un peu autour de cela, car en mode debug j'ai un assert sur le CFILEdialog. Je ne sais pas pourquoi l'assert me parle d'une erreur dans un fichier sur le f:\XXX\YYY\, j'ai bien un f:\ mais il est vide ...
 
En regardant un peu ca vient d'un test sur m_ofn, là je ne sais plus exactement lequel. Après avoir fait quelques recherches j'ai vu que ca pouvait se régler en changeant le 'linkage' des MFC, oui mais si je fais cela je me retrouve avec des erreurs comme quoi new ete delete ont déjà été déclarés .... alors pour contrer cela j'essayer de bouger le include d'afx, mais alors j'ai une autre erreur impossible d'utiliser un MFC quand windows.h a été inclus ... (c'est un projet DX9).
 
Je précise que le partie affichage n'est pas mienne de base mais celle d'un collègue, qu'il a lui même récupéré du travail d'un ancien stagiaire qui ne fonctionnait pas trop, donc en gros il a fait des "patchs", et je fais pareil là mais sans trop savoir à quoi on touche ..
 
Merci,

Reply

Marsh Posté le 04-06-2006 à 00:19:11    

Désolé. Je ne peux pas en dire davantage.
 
Il faudrait présenter une trace de debugage pour déterminer l'origine de l'exception. J'ai, fort heureusement, eu aucune difficulté majeure avec le CFileDialog. Mais je développe que des applications full MFC. Ceci explique peut être cela.
 
Les problèmes d'inclusion/exclusion de prototype WIN32 et MFC est un problème complexe. Pareil pour l'édition de liens.
 
Ah oui j'ai oublié de préciser : VS 6.0 et MFC 5.2. Y a peut être un problème avec VS 2003 qui sait...


Message édité par slash33 le 04-06-2006 à 00:25:45
Reply

Marsh Posté le 04-06-2006 à 02:17:20    

merci tout de même :jap:

Reply

Marsh Posté le 05-06-2006 à 15:42:33    

bon je suis en train de regarder là, c'est bien intéressant ce que tu m'as écrit.
 
lpstrFile est bon, mais lpstrFileTitle est tronqué.
J'ai essayé d'augmenter la taille de nMaxFileTitle avec une affectation mais ca n'a pas l'air d'être la bonne manière car cela ne change rien.
 
Je continue,
merci :jap:

Reply

Marsh Posté le 05-06-2006 à 15:42:33   

Reply

Marsh Posté le 05-06-2006 à 16:27:54    

je m'en suis sorti avec :  

Code :
  1. CString strFilter = "DYN Files (*.dyn)|*.dyn|All Files (*.*)|*.*||";
  2. CFileDialog fileDlg (TRUE, NULL, NULL,  NULL, strFilter, NULL);
  3. char szOpenMRSFileTitle[128+1];
  4. fileDlg.m_pOFN->lpstrFileTitle = szOpenMRSFileTitle;
  5. fileDlg.m_pOFN->nMaxFileTitle = sizeof(szOpenMRSFileTitle);


 
Merci bien pour ton aide

Reply

Marsh Posté le 06-06-2006 à 15:07:24    

je up pour la suite du problème :jap:

Reply

Marsh Posté le 06-06-2006 à 16:21:05    

Bon je m'en suis sorti avec un getopenfilename finalement, les MFC c'est pas mon truc on dirait ..

Reply

Marsh Posté le 10-06-2006 à 17:48:33    

Bon j'arrive trop tard on dirait...

Reply

Marsh Posté le 12-06-2006 à 11:29:58    

Salut,
ben nan pas trop tard j'ai encore une question :)
 
Dans le programme souvent on met des path relatifs par rapport au 1er repertoire du programme. Mais quand j'utilise mon openfile, et bien quelque part il change le repertoire racine, et donc tout les autres file open ne fonctionne plus.
en gros après au lieu d'avoir
racine = \monprogramme
j'ai racine = \moinprogramme\repertoiredufichierouvertparopenfilename.
 
Si tu as une idée je suis preneur :)

Reply

Marsh Posté le 12-06-2006 à 11:56:18    

résolu avec :  
[code]
char dirname[256];
GetCurrentDirectory(sizeof(dirname), dirname);
st.lpstrInitialDir = dirname;
 
puis avant mon parse
SetCurrentDirectory(dirname);
:hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed