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

Delphi Discussion :

CoInitialize n'a pas été appelé & Handle de fenêtre non valide


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut CoInitialize n'a pas été appelé & Handle de fenêtre non valide
    Salut tout le monde.

    J'essaie de créer un Service.
    Comme indiqué dans la FAQ : http://delphi.developpez.com/faq/?pa...alizenonappele
    j'ai mis un CoInitialize( nil ); dans le ServiceStart et un CoUnitialize; dans le ServiceStop.

    Ce service est un serveur en TCP/IP, lors d'une connexion d'un client, je vais ouvrir un document XML avec un objet TXMLDocument de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        aXMLDoc := TXMLDocument.Create( Application );
        aXMLDoc.DOMVendor := GetDOMVendor( 'MSXML' );
        aXMLDoc.Active := True;
    Et j'ai le message d'erreur :
    CoInitialize n'a pas été appelé
    au moment de l'acitvation alors qu'il a bien été appellé lors du lancement du service (j'ai mis un ShowMessage pour vérifier). Je n'ai pas ce problème lorsque je fais la même chose avec une application classique.

    Je décide donc de mettre un nouveau CoInitialize juste avant de créer l'aXMLDoc, il ne me met plus de message d'erreur. Par contre, lors de la fermeture du service, j'ai ce message d'erreur :
    Handle de fenêtre non valide
    Si pendant le service, il n'y a pas de connexion de client qui demande d'ouvrir de document XML (et donc pas de double CoInitialize), il n'y a pas de message d'erreur à la fermeture du service.

    J'ai bien trouvé cette aide dans la FAQ : http://delphi.developpez.com/faq/?pa...enetreinvalide
    Mais je doute que ce soit la solution dans mon cas, car un service n'est pas obligé d'avoir de fenêtre visible.

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    c'est quoi ton xmldoc je me souvient avoir eu un probleme de ce type dans une isapi
    il as fallu que je change de composant xml

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  3. #3
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    C'est un objet du type TXMLDocument déclaré dans le uses XMLDoc.
    Il permet de lire et d'écrire dans un document de type XML ou un flux XML.

    Lorsque je travaille avec une application classique sans TCP/IP, il ne me pose pas de soucis.
    J'ai l'impression que le problème vient du fait que le service en TCP/IP créé et gère des Threads, qu'il faudrait faire un CoInitialize pour chaque Thread. Mais je n'en suis pas sûr.

    J'ai aussi essayé la solution de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       SetForegroundWindow(maForm.Handle);
       Windows.SetFocus(maForm.Handle);
    Mais ça n'y a rien changé, je ne sais pas trop quelle form mettre.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    il me parait evident d'utilise COINITIALIZE avec des object DCOM

    par contre tu devrais les encadrer dans des thread different
    afin que la liberation se fasse par paire


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    C'est le TXMLDocument l'objet DCOM ?
    J'ai essayé de mettre un CoInitialize en début du tcpExecute et CoUninitialize en fin (pour le mettre en début et en fin de thread), mais ça ne marche pas convenablement.

  6. #6
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonjour,
    Peut être une bétise mais ne faut-il pas ajouter (souvenance d'un probléme similaire avec un TDatamodule dans une dll...),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
    ....
    MonObjet.Dcom.open;
    end;
    par hasard? et bien sûr le fermer aprés le free
    Cordialement,
    Hauwke

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    si je me souvient bien de ce que tu as dit tu avait deux coinitialize dans un meme thread et c'est d'ailleur pour ca qu'a la liberation cela plante ?

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Au départ, j'ai mis un CoInitialize dans le ServiceStart et un CoUnitialize dans le ServiceStop.
    Donc ils ne sont pas en fonction des threads mais pour le Service.

    Mais ainsi, j'ai le message d'erreur :
    CoInitialize n'a pas été appelé
    J'ai donc rajouté un CoInitialize et un CoUnitialize dans chaque nouveau thread créé par le tcpServeur (composant Indy).

    J'utilise les TXMLDocument et d'autres API comme les objets automation d'Excel et je n'avais jamais eu besoin de faire un
    MonObjet.Dcom.open;
    .
    D'ailleurs, dans la FAQ, on n'en parle pas, mais peut-être est-ce cela.

    Dès que j'ai le temps de revenir sur ce bug, je teste.

  9. #9
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je viens de refaire quelques tests.

    J'ai retiré les CoInitialize et CoUninitialize globaux de l'application.
    Je les ai mis en début et fin de TfServer.tcpExecute, l'événement OnExecute du TIdTCPServer (le composant Indy qui gère un serveur TCP/IP).

    Et j'ai exactement les mêmes erreurs qu'avant.

    Vous me parlez d'objet DCOM, mais je ne sais pas de quels objets vous me parlez, je n'utilise qu'un TIdTCPServer et un TXMLDocument.

  10. #10
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je continue à charger, apparement, cela viendrait du fait qu'un Thread ne s'arrêterait pas proprement. Il serrait toujours en cours, je vais chercher de ce côté là.

    Je donne des news quand j'en ai.

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    le XmlDoc est un object decom et c'est donc de lui que je parler quand a faire des appli internet avec indy je ne les fait que tres peu preferant de loin les composant de francois piette

    mais effectivement si vos thread de connexion ne sont pas correctement gerer il risque d'y avoir des conflit


    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je me suis trompé sur les Threads non fermés, ça ne vient pas de ça.
    Ils sont bien tous fermés quand j'essaie de fermer le service et j'ai le message d'erreur :
    Handle de fenêtre non valide
    J'ai fait exactement ce qui est indiqué dans la FAQ : http://www.developpez.com/delphi/faq...enetreinvalide
    Ca n'a rien changé.

    J'ai vu que les systèmes avec 2 moniteurs avaient ce genre de problème, je me suis remis sur 1 seul moniteur, redémarré la bécane, ça ne change rien.

    J'ai cherché du côté de la création de la première form, si c'est une form classique ou le service, rien n'y fait.

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    peut tu creer un petit projet qui reproduit ton probleme
    afin que je puisse me rendre compte de ce qui peut clocher
    je dit pas tout ton projet mais juste le truc qui plante

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  14. #14
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    En créant 2 projets vides, 1 pour la partie Service/Serveur et 1 pour la partie cliente, je ne reproduis pas le bug.

    Je vais donc chercher ce qui différencie les projets existants et les projets de test (mis à part le nombre de ligne ).
    Le jour où je trouve, je paie le Champomy à tous les développeurs !

  15. #15
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Bon, j'ai trouvé une solution mais je suis pas trop content parce que ce n'est qu'un gros pansement sans comprendre ce qui se passe.
    Dans le ServiceStart, j'affiche un très court instant la fenêtre principale, puis je la cache. De cette façon, il n'y a pas de soucis de Handle.

    J'aurrais préféré une solution plus propre, mais le principal est que ça marche.
    Je mets (enfin) le Tag [Résolu].

    Bye.

  16. #16
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    dans ton service tu n'aurait pas creer des composant ayant pour parent une form par hasard ?

    parce que je voit vraiment pas ce que vient faire un handle de fenetre non valide

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  17. #17
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    J'ai bien des composants qui ont un parent Form, mais dans le cas du Service (et d'autres cas aussi), ce parent est nil, la Form n'est pas créée.
    Mais dans d'autres projets (non Service, non Serveur TCP), ce parent est aussi nil. Et ce parent n'est pas la fenêtre que j'affiche brièvement dans le Service.

  18. #18
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Juste pour revenir sur une chose, vous parliez du composant XML qui était un objet DOM, et qu'il fallait utiliser une méthode Dcom sur ce composant, ne serait-ce pas plutôt du composant IXMLDOMDocument que vous parliez ?
    Il est dans traité dans ce document : http://big.developpez.com/delphi/xml/msxml/

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

Discussions similaires

  1. [WD12] handle de fenêtre non valide
    Par gbzmt dans le forum WinDev
    Réponses: 4
    Dernier message: 05/11/2013, 11h02
  2. Handle de fenêtre non valide
    Par ired dans le forum Langage
    Réponses: 17
    Dernier message: 26/04/2010, 11h40
  3. Handle de fenêtre non valide
    Par bernie.noel dans le forum Langage
    Réponses: 5
    Dernier message: 18/03/2008, 18h48
  4. Réponses: 11
    Dernier message: 02/11/2006, 13h36
  5. Handle de fenètre non valide
    Par minnit_s dans le forum C++Builder
    Réponses: 4
    Dernier message: 01/01/2006, 19h26

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