|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : avril 2007 Messages : 172 ![]() |
Bonjour,
Pour ceux qui me disaient, il ne faut pas utiliser un buffer statique, utiliser une allocation dynamique de mémoire... ou à quoi sert un Generic_write ou un FILE_SHARE_READ etc... voilà ci-dessous un module de test épuré de tout, plus de CreateFile, plus de ReadFile, donc plus de buffer, simplement pour montrer que mon problème n'a rien à voir avec ces précédentes suspicions. Ce module ne fait qu'une seule chose: appel à la fonction GetOpenFileName et c'est tout, avec juste un message 1 avant l'appel et un message 2 après l'appel et le phénomène que je décrivais dans une autre discussion persiste. Lorsque je choisis un petit fichier jusqu'à 80Ko je n'ai aucun problème, si je choisis un fichier d'environ 1Mo le message 2 s'affiche puis disparaît tout seul ainsi que la fenêtre ceci parfois dès le premier essai ou au minimum 1 fois sur 3 ou 4 essais. Et je répète il n'y a plus aucune ouverture ni lecture de fichier donc, a priori, il ne devrait y avoir aucun rapport avec la taille du fichier. Précisions concernant les autres tests que j'ai pu faire, quand le message 2 disparaît je ne sors de ma fenêtre ni par le WM_CLOSE, ni par le WM_DESTROY, ni par le WM_QUERYENDSESSION, puisque j'ai mis des messages pour piéger ces sorties. Enfin, point important ce programme fonction correctement partout ailleurs que chez moi, ma copine a un micro au même niveau que le mien sur lequel ce programme fonctionne parfaitement, je l'ai passé à d'autres personnes à la fois le source à compiler chez eux ou bien l'exécutif directement et personne n'a rencontré le problème. Autre point important, ce module a été compilé chez moi avec Borland, une autre personne à qui j'avais passé le source l'a compilé chez elle avec vc++ et m'a envoyé le .exe et bien ce .exe compilé ailleurs avec un autre compilateur se comporte chez moi de manière identique (disparition du message 2 tout seul). J'ai essayé chez moi de lancer l'exécutable ailleurs que sur mon disque C, sur un disque externe ainsi que sur une clé USB sur lesquels j'avais aussi installé un fichier d'1Mo qui pose problème, le phénomène se reproduit toujours à l'identique. Ce qui est sûr c'est que le problème est bien chez moi. J'ai défragmenté mon disque dur, fait une analyse complète du disque par McAfee, rien n'y fait, j'ai toujours le problème. D'où ma question, c'est probablement un problème du Windows chez moi, quelqu'un aurait-il une idée, au vu des tests déjà effectués, de l'endroit où il faudrait que j'aille fouiller dans Windows ? Merci. Ci-dessous la version épurée: Code :
|
||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Développeur informatique Inscription : novembre 2006 Messages : 4 453 ![]() |
cheminfile[257] doit être initialisé à 256 et non 257.
Si tu regardes le MSDN on utilise fréquemment la constante MAX_PATH qui équivaut à 256 pour GetOpenFileName. |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : avril 2007 Messages : 172 ![]() |
Bonjour,
Merci pour la réponse, mais ça serait bien si c'était aussi simple que ça. 256 c'est ce que j'avais mis au départ, j'ai ensuite essayé 257 dans le buffer pour être sûr que le .nMaxFile (voir ce paramètre) avait ses 256 sans le 0x0. Mais Le fait de mettre 256 ou moins ou plus ne change malheureusement absolument rien au problème, je peux te le confirmer. Encore une fois, ce qui m'intéresse ça n'est pas de chercher la petite bête dans le programme, il n'y en a pas (sinon comment expliquer que le programme marche partout ailleurs que chez moi, facile à vérifier: suffit de recopier le code tel quel et de le compiler chez soi pour le vérifier), ce qui m'intéresse c'est de pouvoir localiser, au vu du phénomène, le module de Windows qui chez moi est vérolé (et évidemment sans avoir à réinstaller, car ça aussi, je sais très bien que ça marcherait). Merci |
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Inscription : avril 2007 Messages : 172 ![]() |
Bon entretemps je me suis aperçu que mon programme de test dans lequel il n'y a plus que la fonction GetOpenFileName n'était pas le seul à se comporter ainsi. En voulant ouvrir un des fichiers qui pose problème avec le Bloc-notes, je me suis rendu compte que le Bloc-notes se comportait de manière identique: sa fenêtre disparaît toute seule de manière intempestive avec ce type de fichier alors qu'avec les petits fichiers le Bloc-notes se comporte correctement (exactement comme mon programme de test!!!). Mais en parallèle j'ai constaté que si j'ouvrais le même fichier avec d'autres progiciels comme: Word, Worpad, Excel et Acrobat le phénomène ne se produisait pas.
Ceci m'a amené à la conclusion qu'il y avait certainement plusieurs manières de programmer la fonction GetOpenFileName et c'est ce que j'ai fait: j'ai tout simplement rajouté l'appel à une callback bidon au paramètre lpfnHook de OPENFILENAME, callback qui renvoie toujours false pour informer quelle ne traite pas les messages (seul message traité dans la callback: le WM_CLOSE) et depuis je n'ai plus aucun problème, plus du tout de disparition intempestive de fenêtre!!! Tout baigne. Je reconnais que je n'ai pas résolu le problème, mais le contournement permet au moins de débloquer mon développement. Peut-être qu'au vu de ces nouvelles infos, quelqu'un pourra-t-il me donner une explication à ce phénomène ???? Merci |
|
|
00
|
|
|
#5 | |
|
Membre du Club
![]() Inscription : avril 2007 Messages : 172 ![]() |
Je viens enfin d'élucider ce problème qui au vu des messages de ce site a beaucoup été lu, mais sur lequel je n'ai pas beaucoup eu de réponse. Voici ci-dessous le message que j'ai adressé à Adobe, je pense qu'il est suffisamment explicite:
Message à Adobe: Citation:
|
|
|
|
20
|
|
|
#6 |
|
Membre émérite
![]() Inscription : juin 2006 Messages : 632 ![]() |
Salut Arthur,
content de voir que tu as pu trouver la source du problème, même si ça n'est pas encore très clair. Est-ce que tu pourrais lancer ton programme avec Dependency Walker (avec le Acrobat Reader foireux) pour éventuellement avoir plus de précisions sur le moment du crash ? C'est quand même très "intéressant" de voir que Acrobat Reader pose problème lors d'appel à une fonction aussi générique que ça. Qu'est-ce qu'ils peuvent bien faire pour déclencher ça ? Ils ont l'air d'être un peu curieux (si seulement ça pouvait se limiter qu'à ça... Bref c'est pas clair, voir même très suspect. On dirait que t'as soulevelé un lièvre (ouais je sais je m'avance un peu mais je n'ai absolument aucune confiance en cette boite). Merci de nous avoir tenu au courant. ![]() Pourrais-tu nous faire suivre la(les) réponse(s), moi ça m'intéresse beaucoup et je ne dois pas être le seul. A plus et bonne continuation. |
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Inscription : avril 2007 Messages : 172 ![]() |
Pour faire les tests il faudrait que je revienne à la version 10.1.0 de Acrobat Reader X et ça me pose problème car comme je l'indique dans mon message je suis maintenant à la 9.4.0 et de ce fait j'ai remodifié toutes mes applis qui utilisent GetOpenFileName pour revenir à un appel standard puisque je n'ai pas de problème avec cette version. En effet, je préfère l'appel standard (sans la procédure de hook qui résout le problème), car bien que avec la procédure de hook ça marche dans tous les cas, le fait de l'utiliser nous fait passer par une boîte de dialogue différente de la procédure standard (sans hook), cette boîte est plus ancienne donc moins ergonomique (ou alors 3ème solution: il faut faire sa boîte de dialogue soi-même, mais ce n'était pas mon but). Je ferai par contre suivre si je reçois une réponse de chez Adobe, ils indiquent cependant explicitement sur leur site qu'ils ne répondent pas forcément, qu'ils recontactent par contre s'ils ont besoin d'infos complémentaires...
A+ |
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() |
Un crash par disparition brutale sans aucun message, pouf! comme ceci, c'est souvent un débordement de pile.
Il est possible qu'Adobe installe une ShellExtension foireuse en effet. Tu devrais regarder ce qui se rapporte à Adobe dans HKEY_CLASS_ROOT...
__________________
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. |
|
|
00
|
|
|
#9 | ||
|
Membre chevronné
![]() Auditeur informatique Inscription : avril 2009 Messages : 119 ![]() |
Confronté au même problème en 2009, j'avais trouvé la solution suivante, très simple :
Il suffit au début de l'application de faire un appel à la fonction CoInitialize() - initialisation des fonctions de la librairie COM - déclarée dans objbase.h et incluse dans la librairie ole32. Code :
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com