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. 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