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 :

utilisation méthodes DLL COM


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut utilisation méthodes DLL COM
    Bonjour, j'ai une dll (dont je ne suis pas propriétaire) qui a notamment l'interface suivante :
    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
     
        dispinterface IScoutManagementSession {
            properties:
            methods:
                [id(0x00000001)]
                VARIANT_BOOL Disconnect();
                [id(0x00000002)]
                IDispatch* GetServerLogManager();
                [id(0x00000003)]
                VARIANT_BOOL GetConnectionStatus();
                [id(0x00000004)]
                IDispatch* GetProfileManager();
                [id(0x00000005)]
                VARIANT_BOOL Connect(
                                BSTR sServerName, 
                                short nPort, 
                                BSTR sPassword);
                [id(0x00000006)]
                BSTR GetLastErrorText();
                [id(0x00000007)]
                short GetLastErrorNum();
                [id(0x00000008)]
                IDispatch* GetServerSettingManager();
                [id(0x00000009)]
                IDispatch* GetServiceManager();
                [id(0x0000000a)]
                IDispatch* GetBatchManager();
                [id(0x0000000b)]
                IDispatch* GetDeviceManager();
                [id(0x0000000c)]
                IDispatch* GetInstallManager();
        };
    J'aimerais pouvoir utiliser une méthode de cet interface (Connect en l'occurence) et donc instancier une classe qui implémentera l'interface.
    Le problème, c'est qu'avec les IDispatch, les IMPLEMENT_DYNCREATE, les COleDispatchDriver, je n'arrive toujours pas à déclarer un objet qui me crée une instance de cette interface IScoutManagementSession , une idée comment faire svp ?

    J'ai testé en faisant :
    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
     
    class ScoutSessionMgr {
    public:
    	explicit	ScoutSessionMgr	();
    	virtual	~ScoutSessionMgr	();
    	bool		InitInstance		();
    private:
    	COleDispatchDriver	m_Session;
    };
     
    ScoutSessionMgr::ScoutSessionMgr ()
    {
    }
     
    ScoutSessionMgr::~ScoutSessionMgr ()
    {
    }
     
    bool ScoutSessionMgr::InitInstance ()
    {
    	HRESULT hr = CoInitialize (NULL);
    	m_Session.CreateDispatch (LPCTSTR("ScoutManagement.ScoutManagementSession"));
    	if (m_Session.GetConnectionStatus()) {
    		m_Session.Disconnect ();
    		return true;
    	}
    	else {
    		return (m_Session.Connect ("128.1.208.219", 8026, "");
    	}
    	return true;
    }
    Mais ça ne marche pas évidemment, le compilo ne me reconnait pas GetConnectionStatus car m_session est un COleDispatchDriver et n'a donc pas les méthodes de l'interface.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Et le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMPLEMENT_DYNCREATE (ScoutSessionMgr, CWinThread);
    qui ne passe pas car ScoutSessionMgr n'hérite pas de CObject.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Mon objet m_Session doit dériver implicitement ou explicitement de l'instance de IScoutManagementSession ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Avec l'mport de la dll, ça fontionne

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Non, finalement, ça ne marche pas j'ai un accès violation à la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hRes = m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
    qui est appelée par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->CreateInstance (NULL, g_id, &ptvoid);
    Et voilà le contexte général de la méthode :
    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
     
    		ScoutManagement::IScoutManagementSession*	ptobj;
    		void *ptvoid=NULL;
    		GUID g_id;
    		g_id.Data1 = 0x9D464D11;
    		g_id.Data2 = 0x08A1;
    		g_id.Data3 = 0x11D3;
    		g_id.Data4[0] = 0xA8;
    		g_id.Data4[1] = 0xCA;
    		g_id.Data4[2] = 0x00;
    		g_id.Data4[3] = 0xC0;
    		g_id.Data4[4] = 0x4F;
    		g_id.Data4[5] = 0x58;
    		g_id.Data4[6] = 0xCF;
    		g_id.Data4[7] = 0xED;
     
    		this->CreateInstance (NULL, g_id, &ptvoid);
    		ptobj = (ScoutManagement::IScoutManagementSession*)ptvoid;
    où this est le pointeur d'une classe dérivée de CComClassFactory.

    L'erreur que j'ai est : "Unhandled exception at 0xcccccccc in Test2005.exe: 0xC0000005: Access violation reading location 0xcccccccc."
    alors que mes variables ont une "gueule" correcte.
    Comme je n'ai jamais utilisé la librairie ATL, n'y aurait il pas un ATL Initialize à faire ou qqchose comme ça ? Merci.

    PS : je précise, j'ai fait le CoInitialize et le GUID est correct vis-à-vis de la dll et de la base de registre.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Bon finalement c'est bon, et c'est tout bête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CoInitialize(NULL);
    ScoutManagement::IScoutManagementSessionPtr	ptobj;
    HRESULT hr = ptobj.CreateInstance(L"ScoutManagement.ScoutManagementSession");
    Et faire l'import pour avoir le tlh

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/09/2011, 09h54
  2. [COM] utiliser la librairie standard dans une dll COM
    Par kacedda dans le forum Visual C++
    Réponses: 5
    Dernier message: 13/03/2008, 14h57
  3. [ASP DLL COM]Comment utiliser tout ca ?
    Par deadliff dans le forum ASP
    Réponses: 2
    Dernier message: 06/08/2007, 14h05
  4. [COM Interopt][VB 2005] Utiliser mes DLL depuis Access
    Par RaelRiaK dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 23/02/2007, 15h06
  5. [COM] Comment utiliser une dll DotNet dans un projet win32 ?
    Par Marmottoc dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 05/05/2006, 15h58

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