Occultation fenêtre d'erreur [Résolu]

Signaler
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010
-
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010
-
Bonjour
Avec Visual studio en C++ est-il possible d'empêcher l'affichage d'une fenêtre d'erreur ( l'erreur étant contenue par le bloc {try..catch..}) . En effet j'aimerais pouvoir éviter l'apparition de la fenêtre d'erreur "File Not Found " dans mon programme.
Merci d'avance.

Cartes1

8 réponses

Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Merci pour les renseignements rt15 .
Je pense que je vais me servir de W32DASM que j'avais déjà utilisé sous Windows98 je vais l'essayer sous XP, me remettre au désassemblage ( je vais rechercher le tutoriel accompagnant le logiciel) et je te tiendrais au courant.
Merci encore pour ton aide c'est très sympa de ta part et bonne soirée.

Cartes1
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,


Bah zut, je vois même pas comment reproduire ton problème.

fopen -> violation d'accès.

CreateFile -> Valeur de retour signalant une erreur.

ifstream -> Il faut tester avec par exemple la méthode fail.


Je suppose donc que tu utilises une librairie intermédiaire, MFC ou autre.


Cette librairie semble préféré afficher un message d'erreur plutôt que
lancer une exception, qui serait interceptée par ton try ... catch.


Je vois pas comment t'aider sans voir un bout de ton code.


Cependant, si tu connais le fichier en question et son chemin, tu peux
tester son existence, et n'appeler la fonction posant problème que si
le fichier existe.


Par exemple (Je sais pas si le coup du GetFileAttributes est la
meilleur : tu peux utiliser fopen, ifstream, CreateFile,
FindFirstFile... si tu préfère. Mais ne pas oublier de fermer le
fichier dans les 3 premiers cas) :
#include "windows.h"

/* Il semblerait qu'il soit oublié dans certains sdk... */
#if !defined(INVALID_FILE_ATTRIBUTES)
#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
#endif

void FonctionQuiAfficheUnMessageSiLeFichierExistePas()
{
MessageBox(0, "Tout est OK", NULL, MB_OK);
}

int main()
{
if (GetFileAttributes("main.cpp") != INVALID_FILE_ATTRIBUTES)
FonctionQuiAfficheUnMessageSiLeFichierExistePas();
return 0;
}
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
Commencer par virer les try catch pour des opérations sur fichier, ce n'est utile qu'avec des appels de méthodes COM qui lancent des exceptions. L'API retourne toujours un statut d'erreur, un simple if suffit, est nettement moins couteux et évite de continuer après un appel défaillant.

if(0 > (long) GetFileAttributes(szfile)) ABSENT

ciao...
BruNews, MVP VC++
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Bonjour
En fait ça ne marche pas mais je dois vous donner plus d'explications:
Je désire fabriquer un utilitaire (pour un progiciel de base de donnée) dont une des fonctions est l'ajout d'enregistrements dans 2 fichiers (un fichier Data et un fichier Index associés). L'inscription dans le fichier Data se fait correctement mais pas dans le fichier Index ce qui provoque l'affichage de 2 fenêtres d'erreur successives. Pour l'ajout de l'enregistrement dans le fichier Index j'utilise une autre fonction et mon programme se déroule normalement mais pour pouvoir poursuivre l'utilisateur final devra cliquer sur ces 2 fenêtres dont je voudrais me débarrasser: en effet j'utilise légalement les API de ce progiciel mais je ne peux en modifier les fonctions ( dont cette fameuse fonction propriétaire d'affichage de l'erreur "inscription impossible dans le fichier Index" et "numéro de fichier non actif ",  alors que ce fichier existe et que le fait de le fermer  ne change rien).
Ma question est donc : peut-on court-circuiter cette fonction de gestion d'erreur dans mon programme mais sans arrêter celui-ci.
Merci encore pour vos réponses.

Cartes1
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Tu es sûr que tu ne peux pas t'arranger pour que les erreurs n'aient
pas lieu ? Ce serait bizarre que la fonction soit destinée à toujours
afficher des messages d'erreurs...


Tu peux essayer de demander de l'aide du côté des développeur de la fonction en question.


Tu ne pourras pas empècher l'apparition de ces messages si cela n'a pas
été prévu dans la librairie (Mode silencieux, sans échec...)


Bon après tu peux essayer de bricoler un peu, mais ce sera pas
simple... Voilà quelques pistes, en gros par ordre de difficulté croissante :


1 Simuler des appuis sur entrée ou espace pour fermer le message dès qu'il apparaît, avec kbd_event ou PostMessage.


2 Le message d'erreur est peut être affiché par un banal appel à MessageBox. Tu pourrais donc faire un hook d'API.


3 Patcher la fonction en nopant l'affichage des messages d'erreurs. Le plus simple si tu as fait un peu d'assembleur.
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Bonsoir


Merci pour ta réponse rt15.


Le problème est que je possède le fichier d'en-tête et la librairie associée mais pas le corps des fonctions de cette librairie. Donc la fonction qui m'intéresse ( fonction d'écriture dans les fichiers Data et Index) possède probablement sa propre gestion de codes d'erreur et ne repasse la main au programme qu'après fermeture des fenêtres d'erreur.
1) Je ne peux donc pas utiliser PostMessage ou kbd_event.
2) Débutant en C++ ( je programme surtout en VB et là j'aurais pu utiliser "On Error Goto") je ne sais pas faire un hook d'API.
3) La 3è solution semble intéressante malgré mes faibles bases en Assembleur ( je n'avais pas pensé à noper mon propre programme) mais il faut utiliser un désassembleur compatible Windows XP, si tu en connait un ça pourrait me dépanner.

Cartes1
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Pour les gratuits je crois qu'il y a WinDbg (De Microsoft), W32DASM, ntsd (Celui-là, tu l'as déjà sur ton PC), OllyDbg...


Bon pour patcher, te faudra peut être un éditeur en hexa...


Un tuto sur ntsd pas forcément réussi.


Faudrait que tu commence par mettre un point d'arrêt sur MessageBoxW
(ou MessageBoxA si la lib a été compilée en ANSI), puis partant de là,
remonté à l'appelante pour noppé le call et l'empilement des paramètres.


On Error Goto ne te sauverais pas... Cela reviens à un try ... catch.


Concernant kbd_event, tu peux essayer de l'envoyer depuis un autre thread.
Messages postés
33
Date d'inscription
vendredi 25 mars 2005
Statut
Membre
Dernière intervention
16 janvier 2010

Bonjour
J'ai enfin réussi à occulter les 2 fenêtres d'erreur incriminées.
merci encore

Cartes1