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

MFC Discussion :

ActiveX et Appartement State initialisation


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 8
    Points
    8
    Par défaut ActiveX et Appartement State initialisation
    Bonjour a tous,

    J'ai l'erreur suivante lorsque j'execute mon projet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Excepción no controlada del tipo 'System.Threading.ThreadStateException' en system.windows.forms.dll
     
    Información adicional: No se puede crear una instancia del control ActiveX '9bd6a64b-ce75-11d1-af04-204c4f4f5020' porque el subproceso actual no está en un apartamento de un solo subproceso.
    Traduction approx. => Exception non controle du type: 'System.Threading.ThreadStateException' dans system.windows.forms.dll
    Information aditionel: Impossible de creer une instance du controle ActiveX -...- parceque le subprocess actuel n est pas dans un apartement d un subprocess unique.
    Je m explique: j ai un windows form, qui instancie un composant ActiveX - c est a ce moment que l exception est lancee.

    D apres l erreur, et la doc, il est precise qu un composant ActiveX peut seulement etre lance dans un appartement State STA, or le formulaire se lance de la maniere suivante:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    //	if(System::Threading::Thread::CurrentThread->ApartmentState == System::Threading::ApartmentState::MTA) {
    //		return -1;
    //	}
    	Application::Run(new Form1());
    	return 0;
    }
    Or lorsque j execute L appartment State contient MTA!!!

    Pas cool! Et bien entendue imposible de modifier l-appartement state lorsqu il a deja ete initialise

    D autre part j ustilise un certain nombre de librairie. Je pense que le probleme doit venir du fait que mes librairies se charge d initialiser mon apartement state avec un qui soit compatible.

    Comment faire pour initialiser un apartement State STA avant qu il ne le soit automatiquement, tout en utilisant mes librairies.

    Merci d avance

  2. #2
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    Essaye de rajouter dans ton _tWinMain ceci : ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	HRESULT hres = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    Si tu veut utliser CoInitilizeEx il faut mettre ça dans ton .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define _WIN32_DCOM
    #include "objbase.h"
    Qui va piano va sano...

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Merci matazz pour ta reponse,

    mais les 2 propositions me donne la meme erreur que precedement.

    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
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
    	//::CoInitialize(NULL);
    	HRESULT hres = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
     
    	if(hres == S_OK ) { return -2;}//The COM library was initialized successfully on the calling thread. 
     
    	if (hres == S_FALSE) { return -3;}	//The COM library is already initialized on the calling thread. 
    	if (hres == RPC_E_CHANGED_MODE) {//A previous call to CoInitializeEx specified a 
    				return -4;				//different concurrency model for the calling thread, 
    										//or the thread that called CoInitializeEx currently belongs 
    										//to the neutral threaded apartment. 
    	}
     
    	System::Threading::Thread::CurrentThread->ApartmentState = System::Threading::ApartmentState::STA;
    	Application::Run(new Form1());
    	return 0;
    }
    Lors de l'execution, le program me renvoie "S_FALSE" -

    J'imagine que je devrait localiser la librairie qui me force l'initialisation de mon thread, et eventuellement la charger dynamiquement. Mais ça ne me parait pas une bonne solution.

    Any proposition?

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/12/2018, 13h09
  2. Modifier une valeur d'un controle ActiveX avant son initialisation
    Par Krysalgir dans le forum Windows Forms
    Réponses: 0
    Dernier message: 20/01/2011, 16h56
  3. comment faire disparaitre automatiquement l'initialisation Activex
    Par ludo_84 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/05/2007, 12h44
  4. [VB]Initialisation d'un activeX à partir de <param>
    Par mr.saucisse dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/01/2006, 13h13
  5. [MFC] Tester l'initialisation d'un ActiveX
    Par poseidon2 dans le forum MFC
    Réponses: 28
    Dernier message: 22/03/2005, 13h56

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