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

cs_max12 1496 Messages postés dimanche 19 novembre 2000Date d'inscription 7 juillet 2014 Dernière intervention - 12 mars 2006 à 06:02 - Dernière réponse : SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention
- 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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 12 mars 2006 à 09:57
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++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de BruNews
Meilleure réponse
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 12 mars 2006 à 16:34
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

Merci SAKingdom 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de SAKingdom
cs_max12 1496 Messages postés dimanche 19 novembre 2000Date d'inscription 7 juillet 2014 Dernière intervention - 12 mars 2006 à 06:28
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
cs_max12 1496 Messages postés dimanche 19 novembre 2000Date d'inscription 7 juillet 2014 Dernière intervention - 12 mars 2006 à 16:52
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
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 12 mars 2006 à 18:54
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.