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 dans un projet sans interface graphique


Sujet :

MFC

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Points : 145
    Points
    145
    Par défaut ActiveX dans un projet sans interface graphique
    Je souhaite utiliser un composant activeX (.ocx) dans un projet projet (VC++ 6) sans interface utilisateur (forcément, avec une interface ça aurait été trop facile) .

    Donc, l'absence d'interface rend l'insertion dans le projet de l'activeX problématique : la manipulation usuelle (Project puis add to project puis components and controls) ne fonctionne pas.

    Si j'ai bien compris, c'est dû à l'absence de conteneur de contrôle activeX dans mon projet.

    : Mes questions :
    - mon diagnostique est il bon ?
    - Comment créer et utiliser ce %ù*! de contrôle ? (A priori en le créant manuellement non ?)

    Merci

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    je n'ai pas essayé ,bizarre.
    néanmoins tu peux ruser ,en generant un projet bidon graphique ,puis inserer ton activex dedans.
    et recuperer les differents wrapper de classes (sources et Includes) pour ton autre projet...

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Points : 145
    Points
    145
    Par défaut [ActiveX] Utilisation d'un activeX sans interface graphique
    Bonjour à tous,
    voici la réponse qui m'a été apporté sur un forum parallèle.

    at first, create an IDL-File from your control :
    msvc->Tools->OLE/COM-ObjectViewer->AllObjects->RightClickOnYourDll->ViewTypeInformation->Save

    //be care with floats from visualbasic ! simple replace "SINGLE" with "float" in the IDL-File yourIDL-File.idl



    now create the both c-files :
    MIDL /ms_ext /c_ext /cstub yourImplFile.c /h yourImplHeader.h yourIDL-File.idl

    as next, include the created interface in your code :

    #include yourImplHeader.h

    //from yourImplFile.c :
    const IID IID__FloodNetDll = {0x0F405369,0xB9FF,0x45B9,{0x82,0x36,0x7E,0x52,0x7F,0x6D,0xA6,0x52}};
    const CLSID CLSID_FloodNetDll = {0x92BEB9AE,0x8447,0x4C78,{0x98,0x5D,0x81,0x4F,0x37,0xA9,0x7E,0x3E}};


    //now the instance :

    _HRESULT hr;
    // pointee to Interface from yourImplHeader.h
    _yourImplClass *IFnDll;

    // initiate COM
    hr = CoInitialize(0);
    //fill the pointee:
    hr = CoCreateInstance( CLSID_FloodNetDll, NULL, CLSCTX_INPROC_SERVER,IID__FloodNetDll, (void**) &IFnDll);

    //do something ith numbers:

    float ret;
    float n1, n2;
    n1=5; n2=7;
    hr = IFnDll->AddNumbers(&n1, &n2, &ret);

    //do something with strings :
    BSTR strPar;
    wchar_t csPar[15]=L"TextParameter";
    strPar=BSTR(csPar);
    hr = IFnDll->ShowText(&strPar);


    //release dll :
    hr = IFnDll->Release();

    // Uninitialize COM :
    CoUninitialize();


    Appliqué à mon projet, en incluant ole32.lib et en remplaçant

    _HRESULT
    Par
    HRESULT
    Ca compile.


    Maintenant, je n'arrive pas à insérer dans mon projet une nouvelle classe issue d'un autre projet aux options de compilation différentes.

    Du coup en essayant de jongler avec les différents option de compilation j'ai des erreurs Variées...

    Dans une première configuration (Sans utilisation des Precompiled Headers, avec l'option « ignore all default libraries » /GN ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error LNK2001: unresolved external symbol __chkesp
    Dans une configuration des options de compilation (Sans utilisation des Precompiled Headers, mais sans l'option « ignore all default libraries » /GN ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error LNK2005: _DllMain@12 already defined in LIBCMTD.lib(dllmain.obj)
    Le résultat est le même avec ou sans ole32.lib

    ar quel bout je dois prendre ça ?

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Points : 145
    Points
    145
    Par défaut Correction probleme compilation
    Pour le problème de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error LNK2005: _DllMain@12 already defined in LIBCMTD.lib(dllmain.obj
    En gros, la librairie C Run-Time (CRT) et la librairie MFC sont linkées dans le mauvaise ordre, et il s'agit de spécifier au complateur le bon ordre.

    On règle facilement le problème en suivant les instruction MSDN ici (une version française existe, mais j'ai pas réussi à remettre la main dessus)

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Points : 145
    Points
    145
    Par défaut Probleme de compilation avec midl
    Héhé. Bon maintenant je me heurte à l'usage de mon composant ActiveX .

    Aprés vérification, les méthodes definies dans mon fichier .idl n'apparaissent pas dans le .h.

    :
    - Comment est il possible que mon interface .h soit différente du .IDL ?
    - Existe t il une alternative à une compilation manuelle avec MIDL ?
    - Si je ne peux pas générer de .H contenant ces méthodes, comment puis-je appeler les méthodes qui sont définie dans le fichier .idl ?
    :


    Exemple de code d'appel pour Connect()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    (...)
    HRESULT hr;
    _DOPCData *IFnDll = NULL ;// Type défini par mon .h généré par MIDL 
     
    // initiate COM 
    hr = CoInitialize(0); 
    //fill the pointee: 
    hr = CoCreateInstance(CLSID_OPCData, NULL, CLSCTX_INPROC_SERVER,DIID__DOPCData,(void**) &IFnDll); 
     
    if (SUCCEEDED(hr)) // equivalent de (hr==S_OK)
    	{
    	if(IFnDll != NULL) { hr = IFnDll->Connect();}
    	}
    (...)
    Par exemple, si j'appelle la méthode Connect() comme dans le code si dessus, il me retourne l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2039: 'Connect' : is not a member of '_DOPCData'
    C'est normal : il n'y apas de référence à Connect() dans mon .h alors que la méthode est bien définie dans le .IDL

    Définition de la méthode Connect() dans le fichier .idl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: opcdatx.ocx
    (...)
    library OPCDATALib
    {
     
    (..)
     dispinterface _DOPCData {
    (..)
     
    methods:
                [id(0x0000000a), helpcontext(0x00004e7a)]
                long Connect(); /
    comprend pas....

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Points : 145
    Points
    145
    Par défaut Correction
    Salut,
    j'ai changé de stratégie :
    pour générer mes classes, j'utilise maintenant le ClassWizard, et je spécifie le .tlb généré grace à MIDL.

    Tout compile, j'ai bien accès à toutes mes méthodes lors de la programmation.

    Mais à l'execution le premier appel à une méthode me crée une erreur de type "acces violation".

    Quelles pistes puis je suivre pour corriger le problème ?

    Voici le code fautif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	const CLSID CLSID_OPCData = {0xFECBB6D0,0x6378,0x4B3E,{0xA0,0xEC,0xDC,0xB2,0x86,0x55,0xBB,0x55}};
    	const IID DIID__DOPCData = {0x64E5C22D,0x279B,0x450D,{0x9A,0x0C,0x1A,0x84,0x31,0xB2,0x1F,0x86}};
     
    		_DOPCData *m_OPCData = NULL;
     
    		HRESULT hr; 
    		hr = CoInitialize(0);		// initiate COM
    		hr = CoCreateInstance(CLSID_OPCData , NULL, CLSCTX_INPROC_SERVER,DIID__DOPCData, (void**) &m_OPCData); 
     
    		if (SUCCEEDED(hr)){ 
    		m_OPCData->SetPCName(_T(""));  // Ca plante là
    		}

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Points : 145
    Points
    145
    Par défaut Trop facile
    Et bien j'avance, mais lentement.
    Si je reprends à la base, en utilisant l'outil « OLE/COM Object Viewer » sur mon composant ActiveX , je génère le fichier .idl suivant :
    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
     
    // Generated .IDL file (by the OLE/COM Object Viewer)
    // 
    // typelib filename: opcdatx.ocx
     
    [
      uuid(7664C9DF-EA9A-48A0-BBCE-BD61A51213DD),
      version(2.0),
      helpstring("OPC Data Control"),
      helpfile("SOPCDATB.HLP"),
      helpcontext(00000000)
    ]
    library OPCDATALib
    {
        // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
        importlib("stdole2.tlb");
     
        // Forward declare all types defined in this typelib
        dispinterface _DOPCData;
     
        [
          uuid(64E5C22D-279B-450D-9A0C-1A8431B21F86),
          helpstring("Dispatch interface for OPC Data Control")
        ]
        dispinterface _DOPCData {
            properties:
                [id(0x00000001), helpcontext(0x00004e71)            
    ]
                BSTR OPCServer;
                [id(0x00000002), helpcontext(0x00004e72)  
    [...]
    Il apparait clairement que je ne dispose pas d'"interface" mais seulement de "dispinterface".

    Je me retrouve donc dans la situation suivante :

    Si j'utilise le .h généré par MIDL à partir du fichier IDL, je ne sais pas accéder aux méthodes de mon _DOPCData : je ne sais pas utiliser les dispinterface . (Message Mer Déc 21, 2005 )

    Si j'utilse le ClassWizard pour créer la classe _DOPCData à partir du fichier .tlb généré par MIDL, j'ai accés à mes méthodes, mais elles ne fonctionne pas : je ne sais pas connecter mon objet au serveur COM. (Message, Jeu Déc 22, 2005 )


    :Auriez vous une petite proposition ?

Discussions similaires

  1. AWT dans un environnement sans interface graphique
    Par peyo_le_fou dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 28/10/2008, 15h06
  2. Créer un Timer (ou équivalent) dans un projet sans Form
    Par avigeilpro dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/05/2007, 17h52
  3. [VB6] Programme sans interface graphique
    Par yuan dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 30/05/2006, 19h29
  4. [Kylix] Programme sans interface graphique
    Par pewpew2001 dans le forum EDI
    Réponses: 1
    Dernier message: 06/10/2005, 19h46

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