Problème avec GetOpenFileName() [Résolu]

Messages postés
1496
Date d'inscription
dimanche 19 novembre 2000
Dernière intervention
7 juillet 2014
- - Dernière réponse : SAKingdom
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
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)
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
34
3
Merci
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++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
10
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 89 internautes nous ont dit merci ce mois-ci

Commenter la réponse de SAKingdom
Messages postés
1496
Date d'inscription
dimanche 19 novembre 2000
Dernière intervention
7 juillet 2014
0
Merci
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)
Commenter la réponse de cs_max12
Messages postés
1496
Date d'inscription
dimanche 19 novembre 2000
Dernière intervention
7 juillet 2014
0
Merci
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)
Commenter la réponse de cs_max12
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
10
0
Merci
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
Commenter la réponse de SAKingdom

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.