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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    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 chevronn�
    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
    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"

  3. #3
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 16
    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