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 :

Connect qui échoue


Sujet :

C++Builder

  1. #1
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Connect qui échoue
    bonjour

    Je continue mes recherches et j'ai des réponses sur la connexion d'une application a Word et encore des questions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        CoUninitialize();
        m_pWordApplication = new WORDVER::TWordApplication(NULL);
        m_pWordApplication->InitServerData();
        ErrorCode = CoInitialize(NULL);
        if( ErrorCode == INIT_NO_ERROR)
        {
           m_pWordApplication->Connect();
           apPtr = m_pWordApplication->GetDefaultInterface();
    D'abord, le coinitialize est semble t'il important si le status est mauvais rien ne passe derrière: il s'agit d'ouvrir un lien decom entre l'appli appelante et Word
    après le type TWordApplication vise le fichier Word_XP_Srvr.cpp
    Pour que Coinitialize ait un status positif il est souhaitable ( indispensable? en phase debug) de le faire précéder d'un CoUninitialize
    Maintenant, bien que le status du CoInitialize soit bon (= 0) on butte toujours sur le connect ( vu sous debugger, on alloue le lien puis on passe sur le destructeur de classe qui tue le lien)
    Qui aurait déjà eu l'expérience de ce sujet et pourrait m'orienter, ce serait

  2. #2
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Evolution du code qui ne change rien
    Bonjour
    J'ai fait des essais à tout hasard
    le nouveau code est comme suit:
    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
     
      try
      {
        CoUninitialize();
        ErrorCode = CoInitialize(NULL);
        if( ErrorCode == INIT_NO_ERROR)
        {
           m_pGlobalPtr = new TWordGlobal( NULL);
           m_pWordApplication = new WORDVER::TWordApplication(NULL);
           m_pWordApplication->InitServerData();
           if( m_pWordApplication != NULL)
           {
              m_pApplicationPtr = m_pGlobalPtr->GetDefaultInterface();
              m_pWordApplication->ConnectTo( m_pApplicationPtr);
     
              ErrorCode = 0;
              bIsConnected = true;
           }
        }
        else
           bIsConnected = false;
      }
    quand j'arrive a GetDefaultInterface, il ne voit pas de lien ouvert et donc appelle Connect qui se comporte comme précédement décrit. à plus

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Tu travailles avec quel framework ? MFC ? BCB ?

  4. #4
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Framework de référence
    Bonjour

    Je travaille avec bcb et la bibliothèque bcb2kaxserver. J'ai peu de doc sur ces produits et de toute façon, ca bug dans le début de la connection avant même que j'ai pu passer le moindre paramètre
    à+

  5. #5
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Le source ou ca plante
    Bonjour

    A titre de commentaire sur la précédente indication je vous donne une trace de debug du connect.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void __fastcall TWordApplication::Connect()
    {
      if (!m_DefaultIntf) {
        _di_IUnknown punk = GetServer();
        m_DefaultIntf = punk;
        if (ServerData->EventIID != GUID_NULL)
          ConnectEvents(GetDunk());
      }
    }
    il ne trouve pas de m_DefaultIntf(normal, pas encore ouvert) et donc appelle GetServer, qui alloue une interface puis la détruit, et donc punk n'est pas initialisé et l'allocation de m_DefaultInterface à rien échoue.
    l'allocation de l'interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
              T* __fastcall operator->() const
              {
                    return intf;
              }
    on ressort de la fonction qui alloue l'interface avec une valeur valide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
              template <class ANOTHERINTF>
              __fastcall DelphiInterface<T>(const DelphiInterface<ANOTHERINTF> &rhs) : intf(0)
              {
                rhs->QueryInterface(__uuidof(T), (LPVOID*)(&intf));
              }
    et au lieu de renvoyer à l'appelant (on est sur le } fermant)
    on rentre dans le destructeur de classe qui détruit l'interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
              __fastcall ~DelphiInterface<T>()
              {
                    if (intf != 0) 
                    {
                      intf->Release();
                      intf = 0;
                    }
              }

  6. #6
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Le code assembleur
    J'ai fait sous debugger le code géneré pour le retour
    il y a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mov eax, [ebp-0x28]
    mov fs:[0x000000000], eax
    mov esp, ebp
    pop ebp
    ret
    visiblement c'est le pop ebp qui conduit au plantage on décale l'adresse de retour qui va envoyer vers un autre module....

  7. #7
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Et on revient au CoInitialize
    Il y a une incohérence dans mon application. J'ai maintenant organisé mon application pour que on sorte avec un Co_Unitialize. Quand je redémarre mon application soit après le CoUninitilize soit après un reboot de la machine le co_Initialize sort un status False comme si on avait déjà ouvert un port Dcom sur le thread.
    Je ne trouve rien dans la doc du CoInitilize qui explique ce phénomène. après tout, avant je forçait le CoInitialize en passant systématiquement immédiatement avant l'ouverture dans le CoUninitilize, ce qui n'est pas sain et peut expliquer les problèmes de connect ultérieurs.
    Comme piste j'explore actuellement le type TWordApplication qui est un fils de TOleServer, qui confirme mon défaut de CoInitialize.
    J'ai fait une recherche dans mon référentiel et je n'ai trouvé qu'un appel a CoInitialize. Celà exclue l'hypothèse d'une autre modification qui aurait introduit un autre CoInitialize
    Je suis toujours en attente d'une suggestion

  8. #8
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut JeanNoel53
    J'ai essaye ceci je ne sais pas si c'est ce que tu cherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TWordApplication *m_pWordApplication = new TWordApplication(this);
    m_pWordApplication->InitServerData();
    m_pWordApplication->Connect();
    Ca compile et s'execute sans erreur

  9. #9
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut this
    Merci de cet avis

    J'ai essayé ton code le this ne passe pas à la compilation
    J'ai donc code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    else if( ErrorCode == S_FALSE)
        {  // False signifie déjà ouvert, on va faire comme si le lien était ouvert
           TWordApplication *m_pWordApplication = new TWordApplication(NULL);
           m_pWordApplication->InitServerData();
           if( m_pWordApplication != NULL)
           {
              m_pWordApplication->Connect();
              bIsConnected = true;
           }
           else
              bIsConnected = false;
        }
    Je plante toujours sur le connect
    Je suis allé voir un petit peu dans Ole et je me suis rendu compte que dans la version 2003 Word n'avait plus de Regedit individuel, il était inclus dans office 11
    Est ce que cette piste te suggère quelques idées, ou une autre?, ce serait

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Je n'utilise pas ces composants, trop de problemes de compatibilite, j'utilise "Ole" comme decrit dans la FAQ
    juste une idee qu'a tu dans tes includes, ceci
    #include "Word_2K_SRVR.h"
    #pragma link "Word_2K_SRVR"

  11. #11
    Membre extrêmement actif
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Par défaut Ce que j'ai fait à partir de vos conseil
    Bonjour

    D'abord merci à tous ceux qui m'ont répondu leurs réponses m'ont permis d'avancer.
    D'abord une petite information sur la cause du problème
    Il y a certainement un effet de bord entre le lien Ole de Word et le code d'IBPP qui gère la base de donnée. En effet en mettant l'initialise de word avant d'appeler IBPP::FactoryDatabase, le code marche et pas après le FactoryDatabase
    donc d'abord le code du connect
    avec l'appel des fonctions
    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
     
           // on initialise d'abord Word
           DocType = objDocument.StrToEnum( *psDocType);
           ErrorCode = m_pDocument->StartReader( DocType);
           if( ErrorCode == INIT_NO_ERROR)
              ErrorCode = m_pDocument->OpenDocument( *psSourceFileName);
           // puis la base de donnée
           wsDatabaseName = L"Interbase";
           if (INIT_NO_ERROR != objMDBManager.ConnectServer( L"LocalHost",
                  m_sDatabasePath, wsServerLogin, wsServerPswd, wsDatabaseFileName))
           {
             return FAILURE;
           }
           if ( FAILURE == objMDBManager.OpenDatabase(m_sDatabasePath.c_str()))
           {
                return FAILURE;
           }
           // Set the class variables with the source and target languages
           m_sSourceLanguage = L"English";
           m_sTargetLanguage = L"English";
           enSourceLanguage = objCLanguage.StrToEnum( m_sSourceLanguage);
           if( FAILURE == objMDBManager.InitiateDatabase( m_sSourceFileName, L"", enSourceLanguage, &iIdDoc, &iSourceId))
           {
                return FAILURE;
           }
    avec les includes
    Word_2K.cpp et Word_2K_srvr.cpp sont dans le projet
    enfin le code du connect

    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
     
        ErrorCode = CoInitialize(NULL);
        if( ErrorCode == INIT_NO_ERROR)
        {
           m_pWordApplication = new WORDVER::TWordApplication(NULL);
           m_pWordApplication->InitServerData();
           if( m_pWordApplication != NULL)
           {
              m_pWordApplication->Connect( );
              bIsConnected = true;
           }
           else
              bIsConnected = false;
        }
        else if( ErrorCode == S_FALSE)
        {  // False signifie déjà ouvert, on va faire comme si le lien était ouvert
           m_pWordApplication = new TWordApplication(NULL);
           m_pWordApplication->InitServerData();
           if( m_pWordApplication != NULL)
           {
              m_pWordApplication->Connect();
              ErrorCode = 0;
              bIsConnected = true;
           }
           else
              bIsConnected = false;
        }
        else if( ErrorCode == E_INVALIDARG)
           bIsConnected = false;
        else if( ErrorCode == E_UNEXPECTED)
           bIsConnected = false;
      }
    Ces codes fonctionnant, en route pour de nouvelles aventures, c'est

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Le connect qui échoue
    Par JeanNoel53 dans le forum Firebird
    Réponses: 2
    Dernier message: 10/10/2012, 10h40
  2. Connect qui échoue
    Par JeanNoel53 dans le forum NetBeans
    Réponses: 13
    Dernier message: 01/11/2010, 21h25
  3. Connect qui échoue
    Par JeanNoel53 dans le forum Firebird
    Réponses: 17
    Dernier message: 31/10/2010, 17h16
  4. [C#]Authentification qui échoue : a chaque fois "Login inco
    Par The_revival dans le forum ASP.NET
    Réponses: 3
    Dernier message: 15/04/2006, 22h36
  5. Réponses: 8
    Dernier message: 07/12/2005, 14h44

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