Problème avec GetOpenFileName()

Résolu
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014 - 12 mars 2006 à 06:02
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 12 mars 2006 à 18:54
Salut,
J'ai un problème avec la fonction GetOpenFileName()

BOOL CALLBACK ExplorerDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND Path;

switch(message)
{
case IDC_BTNUPLOAD:
{
OPENFILENAME file;
char FileName[MAX_PATH];
char Pathname[MAX_PATH];

ZeroMemory(FileName, sizeof(FileName));
ZeroMemory(&file, sizeof(file));

file.hwndOwner = hwnd;
file.hInstance = NULL;
file.lpstrCustomFilter = NULL;
file.nMaxCustFilter = 1;
file.nFilterIndex = 1;
file.lpstrFileTitle = NULL;
file.nMaxFileTitle = NULL;
file.lpstrInitialDir = NULL;
file.lpstrDefExt = NULL;
file.lCustData = NULL;
file.lpfnHook = NULL;
file.lpTemplateName = NULL;
file.lpstrFilter = "Tous les Fichier (*.*)\0*.*\0";
file.lpstrDefExt = "*.*";

file.nMaxFile = sizeof(FileName);
file.lpstrFile = FileName;

file.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
file.lStructSize = sizeof(file);

if (GetOpenFileName(&file))
{
GetWindowText(GetDlgItem(hwnd, IDC_LISTE_PATH), Pathname, 512);
UploadFile(FileName, Pathname);
}
}
break;
}

return 0;
}

Voilà, parfois pendant que la fenêtre est ouverte j'obtient un plantage de l'application (avant de cliquer sur OK).

Exception non gérée à 0x7ca614ae dans Client trojan v2.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x01384f90

C'est très bizarre, car ça se passe de façon aléatoire on dirait. Souvent c'est après un deuxième appel de la fonction que ça plante. Je n'ai pas encore une grande connaissance du C alors je me demandais si vous auriez une explication, ou peut-être qu'une chose pareil vous serait déjà arrivé (l'expérience quoi). J'ai regardé partout dans l'appli je n'ai pas trouver de mémoire qui semble empiéter.

Aussi je voudrais une info, la fonction GetOpenFileName() étant autoblocante, comment ce fait-il que je peux continuer à utiliser mon programme (y compris la fenêtre qui a lancé le get) sans qu'il bloque ? Et même appeler une deuxième fenêtre d'ouverture (en mettant hwndOwner = 0)

A+

http://vbaddons.free.fr

if (CPossible)

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 mars 2006 à 09:57
lpstrFilter - est lu en tant que chaine 'multi part' où chaque partie est normalement terminée par un zéro et le dernier élem DOIT terminer par 2 zéros, exemple "*.*\0*.*\0\0".
Vire les ZeroMemory inutiles: Filename[0] = 0; suffit pour finir une chaine.
file.lStructSize = sizeof(OPENFILENAME); !!!

GetWindowText(GetDlgItem(hwnd, IDC_LISTE_PATH), Pathname, 512);
d'où sort ce 512 ???

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 mars 2006 à 16:34
Oui pourquoi 512. La limite de Pathname est MAX_PATH qui a une valeur de 255 ou 256 ché plus trop. Ça serais plus prudent de faire GetWindowText(GetDlgItem(hwnd, IDC_LISTE_PATH), Pathname, MAX_PATH ou sizeof(Pathname));

___________________________________________
Les plus grands esprits trouvent toujours une solution
3
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
12 mars 2006 à 06:28
En passant, je sais que mettre à null était inutile à cause du ZeroMemory() mais j'étais rendu pas mal désespéré :P

http://vbaddons.free.fr

if (CPossible)
0
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
12 mars 2006 à 16:52
Pour le GetWindowText() je m'en suis aperçu après le post, je venais tout juste de changer le code cette section et j'avais oublier les nouvelles dimentions. Merci pour les conseils, mais ça ne règle pas, je vais continuer à chercher d'éventuel dépassement dans le code, mais la au moins je sais qu'elle est maintenant initialisée comme il faut.

A+

http://vbaddons.free.fr

if (CPossible)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 mars 2006 à 18:54
T'as peut-etre pas besoin de mettre autant d'info dans ton OPENFILENAME
Tien ceci peut faire l'affaire.

FileName[0] = '\0';
ZeroMemory(&file, sizeof(file));

file.lStructSize = sizeof(file);
file.hwndOwner = hwnd;
file.lpstrFilter = "Tous les fichiers (*.*) \0 *.* \0\0";
file.lpstrFile = FileName;
file.nMaxFile = MAX_PATH;
file.lpstrDefExt = "*.*";
file.lpstrTitle = "Ouvrir un fichier...";
file.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
Rejoignez-nous