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 :

intégrer un fichier .tlb dans un projet MFC


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut intégrer un fichier .tlb dans un projet MFC
    Bonjour,
    Je veux intégrer un objet COM .tlb dans mon application MFC
    j'ai ajouter ce fichier sur mon projet mais je sais pas comment le gérer, j'ai aucune idée sur comment le faire

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Fais un clique droit sur ton projet comme si tu ajoutais une classe.
    Et tu verras dans la fenêtre de l'assistant "Ajoute de Classes" comment ajouter une classe à partir d'une librairie de type.

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    j'ai pas compris ce que vous venez de dire
    j'ai déja intégrer le .tlb dans mon projet mais après je plante
    je veux afficher l'interface associée à ce ce tlb
    Merci d'avance

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    j'ai pas compris ce que vous venez de dire
    j'ai déja intégrer le .tlb dans mon projet mais après je plante
    je veux afficher l'interface associée à ce ce tlb
    Merci d'avance
    salut intégrer un objet COM ( ocx/dll) dans un projet est plus complexe;
    il faut au préalable utiliser la directive #import nom_dll_nom_interface
    Puis appeler CoCreateInstance et QueryInterface pour créer des pointeurs sur les méthodes de l'objet COM.
    En ajoutant la dll /objet COM ( ocx /dll ) Visual C++ va générer un fichier d'interfaces et les ID des interfaces de l'obet
    Je conseille de regarder dans le MSDN c'est trop complexe à expliquer ici..

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour 3aychoucha.

    Pourquoi avoir créer un nouveau sujet ->

    http://www.developpez.net/forums/d99...ivex-winforms/

    Sinon, j'en conclu que tu as compris l'histoire des tlb.

    Donc ensuite un point de départ, dans un fichier d'en-tête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #import "ControleActiveX.tlb" raw_interfaces_only
    using namespace ControleActiveX;
    Evidemment il faudra remplacer par les bons noms. A partir de là intellisense fonctionnera.

    Exemple d'utilisation :

    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
     
    ControleActiveX::IControleActiveXPtr m_pControleActiveX = NULL;
    bool m_bDllInitialized = false;
     
    try{
     
      ControleActiveX::IControleActiveXPtr pControleActiveX(__uuidof(ControleActiveX::CControleActiveX));
     
      m_pControleActiveX = pControleActiveX;
     
      pControleActiveX = NULL;
     
      // le code de retour de la méthode de l'ActiveX
      long lRet = -1;
      _bstr_t bstr("Une chaîne de caractère à passer en paramètre");
      BSTR Bstr;
      Bstr = bstr.copy();
     
      m_pControleActiveX->UneMethode(Bstr, &lRet);
     
      if(lRet == 0)
        m_bDllInitialized = true;
    }
    catch(...){
     
      if(m_pControleActiveX){
        m_pControleActiveX = NULL;
    }
    Bien sûr, c'est juste un exemple, les noms de méthodes et les paramètres seront différents.
    Il faudrait aussi le code d'erreur, puisqu'une dll COM retourne un HRESULT. Dans cette exemple, je me base sur un code d'erreur personnalisé (lRet).

    PS : ne pas oublier d'initialiser COM avant (CoInitialize).

  6. #6
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Merci Mat.M
    Merci moldavi, en fait j'ai crée cette nouvelle discussion car je crois qu'il ya une différence entre l'intégration d'un activeX et d'un .tlb

  7. #7
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    moldavi, est ce que vous pouvez svp m'expliquer un peu le code
    UneMethode(Bstr, &lRet) représente quoi?
    comment par exemple je peux afficher l'interface associée à mon tlb (c'est un .vi)
    Merci d'avance

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Quel compilateur utilisez-vous ?

    Avec seulement ces deux lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #import "ControleActiveX.tlb" raw_interfaces_only
    using namespace ControleActiveX;
    et avec visual studio 2008, intellisense m'affiche les interfaces et les méthodes. Bien sur dans mon cas, je les connais d'avance, puisque j'ai écris la dll managed.
    Il faut au moins connaître le namespace, et il peut y en avoir plusieurs.

    Pour que intellisense m'affiche les données, je tape "ControleActiveX::", et là j'ai tout.

  9. #9
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Un fichier .tlb ne s'enregistre pas sur le système. C'est l'activeX à partir duquel on génère le tlb qui doit être enregistré.

  10. #10
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    merci moldavi,
    j'ai pu importer mon tlb mais lorsque je veux créer une instance de l'objet, ça retourne NULL
    voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HRESULT hres=pLV.CreateInstance("MyNameSpace.Application");
    		if (pLV == NULL)
    		{
    			AfxMessageBox(_T("LV must be running, exiting ...\n"));
    			break;
    		}
    Avec un .dll le problème se résout par l'installation du dll avec regsvr32, pourtlb ça n'a pas marché avec regtlib

  11. #11
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    J'ai pas de dll
    j'ai seulement un .tlb et un .exe
    et il me faut intégrer l'interface du point exe( c'est un .vi) sur une boite de dialogue mfc

  12. #12
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Je vous ai déjà posé la question : êtes-vous certain que le .exe est un contrôle activeX, du moins qu'il répond au critère d'un objet COM ?

    Donnez-nous plus d'information sur l'exe et sur votre code, on tourne en rond.

  13. #13
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    c'est un activeX Automation server et moi je veux faire la partie client

    Pour le code de mon application c'est une simple application dialog based
    puis j'ai suivi ce code

    code:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    // Acquire.cpp : This source code is an Automation client. It calls the
    // LabVIEW 5.0's automation server. It loads the VI Acquire 1 Point from 1 Channel
    // VI and runs it.
    //
     
    #include "windows.h"
    #include "stdio.h"
    #include "conio.h"
    #include <stdlib.h>
    #include <string.h>
    #include <iostream.h>
    #import "c:\lv50\RESOURCE\labview50.tlb"
     
    main() 
    {
    	VARIANT sample;
    	int size = 0;
    	char Path[1000];
     
     
    	// define the path to the application
    	char VIPath[100] =  "\\examples\\daq\\anlogin\\anlogin.llb\\Acquire 1 Point from 1 Channel.vi";
    	// generate a  namespace declaration to and identify and assign a name to a declarative region.
    	// In this case we are assigning the LabVIEW.
    	using namespace LabVIEW;
    	_ApplicationPtr pLV;
    	VirtualInstrumentPtr pVI;
     
     
    	CoInitialize(NULL);
    	do 
    	{
     
    		pLV.CreateInstance("LabVIEW.Application");
    		if (pLV == NULL)
    		{
    			printf("LV must be running, exiting ...\n");
    			break;
    		}
    		pVI.CreateInstance("LabVIEW.VirtualInstrument");
    	    strcpy(Path, pLV->ApplicationDirectory);
    		strcat(Path, VIPath);
     
    		// assign an object reference to the pVI.
    		pVI = pLV->GetVIReference(LPCTSTR(Path));
     
    		// configure the VI to show its front panel on Call.
    		pVI->ShowFPOnCall = TRUE;
     
    		pVI->SetControlValue("device","1");
    		pVI->SetControlValue("channel", "0");
     
    		//Transfer control to LabVIEW with the Run statement.  The call function passes the parameter names
    		// and data to the LabVIEW VI.
    		pVI->Run();
    		sample = pVI->GetControlValue("sample");
    		printf("The sample Value is %f \n", sample.fltVal);
    		while( !kbhit() )
    		cout << "Hit any key to continue\r";
    		fflush( stdin );
    		pLV->AutomaticClose=0;
     
    	} while (0);
    	CoUninitialize();
    	return (0);
    }
    j'ai un problème au niveau du CreateInstance, il m'affiche
    LV must be running, exiting ...
    càd que le pLV est null et il n'y avait pas de creation de l'ainstance de l'application

    Merci d'avance

  14. #14
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par 3aychoucha Voir le message
    c'est un activeX Automation server et moi je veux faire la partie client
    J'imagine que l'utilisation d'un activeX Automation server est un peu plus complexe qu'une simple dll COM. Il doit y avoir de la gestion droits d'utilisateurs en plus. Je vais me renseigner un peu plus, mais la réponse devrait se trouver sur les sites de la MSDN.

    Je ne comprends pas la phrase "je veux faire la partie client", un activeX on l'utilise dans un programme...

  15. #15
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    En regardant 5 minutes sur le net, j'ai trouvé sur le site de LabView, un code source qui explique l'utilisation de cet activeX (lvdemo.zip):

    http://zone.ni.com/devzone/cda/epd/p/id/750

    L'avez-vous téléchargé ?

  16. #16
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,

    le code que je l'ai affiché je l'ai pris aussi du site de labView
    http://zone.ni.com/devzone/cda/epd/p...#0requirements
    mais au niveau de "GetVIReference", une exeption est générée
    Exception Microsoft C++*: _com_error à l'emplacement mémoire 0x002ae944..

  17. #17
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Utilises un bloc try/catch et récupère la ComException.

    Il y a deux méthodes, une avec password, l'autre sans.

  18. #18
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Comment je peux le faire
    je suis débutante en C++

  19. #19
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,

    même si je mets le bloc entre un try et catch, ça ne résout pas le problème et l'exception s'affiche dans la console de VS au lieu de s'afficher dans une boite de dialogue: en fait ça change rien

    Merci

  20. #20
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    il faut vérifier que le tlb est bien enregistré (avec regtlibv12) c un peu délicat mais ça marche enfin
    juste il faut trop de patience

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

Discussions similaires

  1. pb pour associé un fichier chm avec un projet MFC
    Par Cédric_07 dans le forum MFC
    Réponses: 9
    Dernier message: 05/12/2006, 15h56
  2. Réponses: 2
    Dernier message: 03/07/2006, 20h14
  3. intégrer un fichier image dans une base de donnée?
    Par Lody dans le forum Requêtes
    Réponses: 9
    Dernier message: 16/03/2006, 19h08
  4. Réponses: 11
    Dernier message: 13/03/2006, 17h51
  5. Réponses: 4
    Dernier message: 24/05/2005, 11h34

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