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++/CLI Discussion :

CoInitializeEx return Fail


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut CoInitializeEx return Fail
    Bonjour,

    J'ai developper une application CLI Windows Form en C++ , j'ai passer en tout 10 heures (apparament pour rien).

    L'application fonctionne mais en bêta et priver , cependant j'utilise une DLL écrite en C , à l'intérieur de cette DLL , l'appel de la fonction CoInitializeEx échoue.
    J'utilise cette DLL dans une application Delphi , et là CoInitializeEx retourne OK.

    Code de ma DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED); 
        if (FAILED(hres))
        {
    		MessageBox(NULL,"Failed initialization COM","",MB_SYSTEMMODAL);
            return FALSE;              // Program has failed.
        }
    Pouvez vous m'aider à résoudre ce probléme d'appel de fonction CoInitializeEx d'une DLL depuis mon projet Windows Form ??
    Il y a un code à rajouter dans mon appli Windows Form , mais rajouter quoi ?

    J'ai besoin de cette DLL et je ne compte pas l'intégrer dans mon appli Windows Form.

    De plus ce qui est étrange : dans MSVC , cette dll écrite en C ne figure pas dans la liste des modules.



    Merci de votre aide ;

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut
    J'ai remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hres =  CoInitializeEx(0, COINIT_APARTMENTTHREADED);
    Ca à l'air de marcher .
    mais pourquoi cela ne marche pas avec l'ancienne paramétre ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    WinForms => STA pour le theard principale.

    Voici le code de déclaration de votre fonction "main" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    STA c'est pour Single Threaded Appartment.

    Cela indique au runtime .NET que le thread doit être le seul dans son "Appartment" (segmentation de l'espace des objets créés via COM).

    C'est le seul mode envisageable pour un thread accédant à des objets graphiques.

    Donc soit vous faites du basic et votre solution est bonne soit vous avez des contraintes de très hautes performances ou de réactivité de l'IHM et là, il suffit de créer un thread dédié en spécifiant que lui est MTA ou FTA qui fera l'appel à CoInitializeEx et aux fonctions de votre Dll C.

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut
    Merci bcp ,
    mais j'ai resolu mon pb en remplacant la ligne incriminé

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Attention, un composant COM ne passe pas d'un type d'appartment à un autre sans problème.

    Vérifiez que le ou les composants qui vont être créé par votre thread d'IHM sont bien STA ou FTA aware.
    Sinon, vous risquez d'avoir les composants COM plantez l'application ou la freezer.

    Si une personne à pris la peine de spécifier "COINIT_MULTITHREADED" dans l'appel de CoInitializeEx, c'est qu'il y a ou avait une bonne raison.

    Si vous vous trompez, vous n'aurez pas d'erreurs de compilation ou systématiquement à l'exécution.

    Les problèmes de compatibilité de composants à un type d'appartment COM peuvent n'apparaître qu'en production, sous forte charge.

    C'est pour cela que l'enregistrement des composants COM indique dans quel type d'appartment ils sont sensés marcher.

    De plus, je soutiens qu'instancier des composants COM non graphiques dans le thread d'IHM est une très mauvaise idée.
    Et dela indépendamment des problèmes d'appartment.

    Allégez au maximum le thread d'IHM. C'est un thread STA, donc la gestion de l'affichage sera en concurrence avec l'exécution du travail dans ces composants COM. Sans compter tout les deadlocks potentiels.

    Faites un thread dédié, sinon, vous allez pleurer.

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

Discussions similaires

  1. Compilation du plug-in : Cleaning qmake failed, return code 2
    Par momo l'plus bô dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/07/2012, 15h52
  2. [Hudson] BUILD FAILED exec returned: 255
    Par stephdemars dans le forum Intégration Continue
    Réponses: 2
    Dernier message: 17/02/2012, 16h32
  3. Réponses: 1
    Dernier message: 18/12/2008, 16h48
  4. [C#] Changer le focus avec la touche return
    Par sblanc74 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/10/2003, 18h38
  5. return
    Par drKzs dans le forum C
    Réponses: 3
    Dernier message: 18/09/2003, 22h36

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