IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Utilisation de SetErrorProc


Sujet :

C++Builder

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Par défaut Utilisation de SetErrorProc
    Bonjour, suis programme sous Borland C++ 5.0
    Suite à un evenement de FastSocket (NMStream), je cherche un exemple de code utilisant la procedure SetErrorProc (ScktComp.hpp> afin de capturer ESocketError par mon programme et non pas le gestionnaire windows.
    Merci.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut
    ScktComp c'est plutôt TServerSocket !
    Je ne pensais pas qu'il était considéré comme faisait pas du groupe Fast comme TNMFTP ou TNMStream

    Tu devrais avoir un OnError sur le TServerSocket ou TClientSocket
    ESocketError étant provoqué par ces deux dernières classes (et sous classes comme TWinClientSocket, TWinServerClientSocket...)

    TNMStream encapsule TClientSocket ?
    ou c'est une utilisation que tu as couplé toi même ?
    C++Builder 5 c'est un peu vieux, difficile de souvenir, cela a tellement changé depuis
    ScktComp est conservé pour compatibilité, pendant une période, les composants était désapprouvé par Borland

    En théorie (selon la doc de XE3)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    TSocketErrorProc OldSocketErrorProc; // une globale quelque part (idéalement, fait un objet singleton)
     
    //---------------------------------------------------------------------------
    void __fastcall /*TForm::*/MySocketErrorProc(int ErrorCode)
    // il n'est pas marqué en __closure donc en théorie pas besoin d'objet
    {
      // ton code ici
     
      if (OldSocketErrorProc)
        OldSocketErrorProc(ErrorCode); 
     
      // ton code possible ici aussi, à toi de voir
    }
     
    //---------------------------------------------------------------------------
    void InstallMySocketErrorProc()
    {
      OldSocketErrorProc := SetErrorProc(MySocketErrorProc);
    }
     
    #pragma startup InstallMySocketErrorProc
    //---------------------------------------------------------------------------
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Par défaut
    Non, j'utilise une simple liaison NMStrmclient vers un NMStrmServer pour le tranfert d'image.
    Si le server n'est pas connecté, j'ai un event windows qui s'affiche malgré la gestion de Onclientconnectionfailed. (je fais NMClient->LastErrorN0=0);
    J'ai un event ESocketError = 10035 qui lui est géré par ScktComp.hpp.
    J'aimerais capturer cet ESocketError gràce à la fonction SetErrorProc, mais je n'ai pas d'exemple.
    SetErrorProc permet de supprimer le popup de windows et de le prendre en charge mais comment....

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut
    Citation Envoyé par Grizou0 Voir le message
    Non, j'utilise une simple liaison NMStrmclient vers un NMStrmServer pour le tranfert d'image.
    Pourquoi ne pas le dire dès le début

    Citation Envoyé par Grizou0 Voir le message
    J'ai un event ESocketError = 10035 qui lui est géré par ScktComp.hpp.
    J'aimerais capturer cet ESocketError gràce à la fonction SetErrorProc, mais je n'ai pas d'exemple.
    As-tu lu le code que j'ai fourni ?
    As-tu essayer de comprendre le code que j'ai fourni ?
    As-tu tenter d'essayer de remplir MySocketErrorProc avec le code que tu veux ?
    As-tu tenter de limiter l'appel à OldSocketErrorProc en fonction du ErrorCode, dans ton cas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //---------------------------------------------------------------------------
    void __fastcall /*TForm::*/MySocketErrorProc(int ErrorCode)
    // il n'est pas marqué en __closure donc en théorie pas besoin d'objet
    {
      // ton code ici
     
      if (ErrorCode != 10035)
        if (OldSocketErrorProc)
          OldSocketErrorProc(ErrorCode); 
     
      // ton code possible ici aussi, à toi de voir
    }
    Faut faire un peu plus d'effort !

    Enfin, as-tu une Exception ou Notification du Déboggueur ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Par défaut
    Merci ShaiLeTroll
    Si je poste, c'est que j'ai longuement cherché, mais merci tout de même pour le support.
    Malheureusement, le code n'a aucun effet et les sources sont très rare.
    SetErrorProc n'est pas interprété apparement.

    Par contre, suivant la doc Pas de Postit, j'ai trouvé la fonction FSocketWindow.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    File *.h
    extern void __fastcall essai(void);
     
    File .Cpp
    //Code 
    void __fastcall TForm1::SendToServeur()
    {
    TMemoryStream *MS=new TMemoryStream();
    StreamLn(MS,"Hello");
     
    NMStrm->TimeOut=10000;
    NMStrm=ReportLevel=1;
    try
      {
      NMStrm->PosIt(MS); //Send message
       }
    catch(...)
      {
      Memo->Lines->Add("TimeOut"); //Display if no server connection
      }
    MS->free();
    }
     
    void __fastcall essai()
    {
    Form1->Memo->Lines->Add("Je suis ici");
    }
    //---------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {//Handle Erreur Socket sur procedure essai
    MNStrm->FSocketWindow=essai;
    }
    //---------------------------------------------------
    Dans ce cas, je n'ai pas d'affichage, donc ça ne passe pas dans ma procédure, par contre, je n'ai plus le MsgBox "erreur windows".
    (Je lance le soft hors de l'éditeur pour éviter l'interprétation du debugger.

    Me reste tout de même l'inconnue, comment capter un erreur Socket Windows et la traiter par mon soft.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 053
    Par défaut
    Citation Envoyé par Grizou0 Voir le message
    SetErrorProc n'est pas interprété apparement.
    Tu n'aurais pas oublié #pragma startup ?

    Tu utilises une version C++Builder vieille de plus de 10 ans avec des composants considérés comme totalement obsolètes,
    il est très difficile de t'aider sur une version 5 alors que personnellement je travaille en version 17 !

    FSocketWindow normalement reçoit une WndProc qu'il est préférable de gérer via AllocateHWnd, ton code me semble douteux !
    D'ailleurs, ce extern est inutile pour faire une "forward declaration"

    Si tu utilisais directement le TClientSocket et sa méthode SendStream, cela serait bien plus facile de t'aider car ce composant existe encore !

    Moi, ce que je ne comprends pas c'est la dépendance entre FastSocket et SetErrorProc de ScktComp !

    Il faudrait que tu lises le fichier source (en pascal, je suppose) de TNMStream pour analyser son fonctionnement !

    Sinon Borland C++ 5.0 ne pas confondre !
    Cet outil existe, c'est un IDE sans builder !
    un autre produit, plutôt conçu pour du C++ standard ou via OWL qui est l'ancêtre de la VCL !

    ici on parle de Borland C++Builder 5
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Par défaut
    C'est bien du borland c++ 5 builder (2002 il me semble).
    Avec #pragma ou en l'incluant de CreateForm, rien n'y fait.
    Mais je dois probablement zapper quelque chose. Par expérience et à force d'insister, je vais trouver.
    Je posterai la soluce si je trouve.
    Merci

  8. #8
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Par défaut
    FeedBack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {//Handle Erreur Socket sur procedure essai
    MNStrm->FSocketWindow=essai;
    }
    Dans ce cas, je viens de m'appercevoir que mon socket ne fonctionne plus

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo