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 d'un ActiveX : InvokeHelper()


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut Utilisation d'un ActiveX : InvokeHelper()
    Bonjour à tous,

    Pour un projet pro (je suis étudiant), j'ai crée une petite appli MFC qui doit lancer et interagir avec un activeX.
    Seulement voilà, j'ai un peu de mal avec le wrappage.
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CControl::SetWifiEnable(LPVOID pc, BOOL bWifiEnable)
    {
    	static BYTE parms[] =	VTS_PHANDLE VTS_BOOL;
    	InvokeHelper(1, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
    		 tpc, bWifiEnable);
    }
    Fonctionne bien (en tout cas ça ne gueule pas à la compilation). Mais j'ai quelques problèmes lorsque je veux passer un tableau parms vide à la fonction InvokeHelper (fonction sans argument). Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int CControl::Stop ()
    {
    	int	result;
    	static BYTE parms[]; //Ne fonctionne pas
    	InvokeHelper(2, DISPATCH_METHOD, VT_I4, &result, parms);
    	return	result;
    }
    Ne fonctionne pas. Comment puis-je réaliser celà? (désolé je suis débutant et la doc ne m'a pas appris grand chose à part que parms devait être une liste représentant le type des paramètres à passer).

    Au passage si vous connaissez des liens avec des bons tutos pour apprendre à faire/wrapper des activeX, je suis preneur (j'ai déjà lu celui de Fairscape, très bon au passage)

    Merci d'avance

  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
    Par défaut
    bonsoir,
    un détail , c'est toi qui fait le wrapper de l'activex ?
    pourquoi ne pas générer la classe directement ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Non en réalité la classe est déjà générée. L'activeX étant déjà crée, j'ai eu accès aux sources.
    L'application que j'ai reprise avait déjà la classe wrapper générée par visual (correspondant à l'activeX). Ce que je voudrais faire, c'est la compléter car j'ai rajouté des fonctions dans mon activeX que je souhaite pouvoir utiliser avec mon appli.

  4. #4
    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
    Par défaut
    si tu as rajouté des fonctions dans l'activex , il faut régénérer le wrapper de classe .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Je ne peux pas simplement rajouter mes fonctions à la fin du wrapper?

    Alors mon OCX inclut une DLL qui elle-même inclut tout mes sous-projets.
    Le fichier .def de mon OCX est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ; ocx.def : Declares the module parameters.
     
    LIBRARY      "ocx.OCX"
     
    EXPORTS
    	DllCanUnloadNow     PRIVATE
    	DllGetClassObject   PRIVATE
    	DllRegisterServer   PRIVATE
    	DllUnregisterServer PRIVATE
    Le fichier .idl est le 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
     
    / ocx.idl : type library source for ActiveX Control project.
     
    // This file will be processed by the MIDL compiler tool to
    // produce the type library (ocx.tlb) that will become a resource in
    // ocx.ocx.
     
    #include <olectl.h>
    #include <idispids.h>
     
    [ uuid(0337E397-A8D4-4250-8680-DC14F86BB8CF), version(1.0),
      helpfile("ocx.hlp"),
      helpstring("ocxActiveX Control module"),
      control ]
    library ocxLib
    {
    	importlib(STDOLE_TLB);
     
    	//  Primary dispatch interface for CocxCtrl
     
    	[ uuid(33087541-1BB7-4557-A402-0E4CFF31A2CF),
    	  helpstring("Dispatch interface for ocxControl")]
    	dispinterface _Docx
    	{
    		properties:
    		methods:
     
    			[id(1)] void Create(...)
    			[id(2)] void RegisterEventCallback(...);
    			[id(3)] void SuspendDisplay(...);
                      ...
    Je dois donc rajouter mes nouvelles fonctions à la main ce que j'ai fait. Pour celà dois-je définir les-dites fonctions en extern lors de leur définition dans les sous-projets comme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    extern "C" void api Start(Handle pc)
    {
       ma fonction
    }
    Ou ce n'est pas nécessaire?

    De même puisque c'est une DLL qui inclut tous mes sous-projets dois-je aussi rajouter ces fonctions dans le .def de ma DLL? (pour rappel, l'OCX inclut ensuite la DLL).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Après relecture du tuto, j'ai une autre question :

    Comment créer la classe wrapper avec visual 2003?

    Merci d'avance,

    CRC

  7. #7
    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
    Par défaut
    salut,
    si ça fonctionne comme visual 2005 et 2008 , tu as la réponse dans le chapitre : VII-B-2: le wrapper est généré au moment d'associer une variable à l'activex.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Salut,

    Merci de ta réponse. Par contre le tutoriel indique que la génération de la classe Wrapper se fait lors de l'ajout de l'ActiveX au projet. Seulement, mon activeX est déjà ajouté, comment puis-je alors regénérer la classe Wrapper?

    Merci d'avance

  9. #9
    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
    Par défaut
    Citation Envoyé par farscape Voir le message
    salut,
    si ça fonctionne comme visual 2005 et 2008 , tu as la réponse dans le chapitre : VII-B-2: le wrapper est généré au moment d'associer une variable à l'activex.
    si le wrapper n'est pas présent (il suffit dont de l'enlever et de mettre de coté celui existant dans le projet.) l'ajout d'une variable sur le contrôle génèrera le wrapper de classe.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Je vais essayer ça merci

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Avant d'essayer, il me reste une question...

    J'ai du mal à voir le rôle de la classe Wrapper. Générée par mon projet OCX, je dois ensuite l'importer dans mon autre projet qui appelle l'OCX c'est ça? Puis je crée une instance de cette classe toujours dans mon projet appelant l'OCX pour pouvoir ensuite appliquer les fonctions exportées par l'OCX?

    Lorsque je débug, j'arrive bien dans les anciennes fonctions de l'activeOCXCtrl (celles que je n'ai pas écrites) mais pas dans celles que j'ai ajouté. Cela vient peut-être, en effet, du wrapper (même si je l'ai mis à jour manuellement de l'autre côté).

    Enfin, comme mon Wrapper est fait manuellement, puis-je avoir des discontinuités dans les numéros de fonctions passés à l'InvokeHelper? Comme par exemple 1,2,3,7,8,9 en supposant bien sûr que ces numéros soient définis du côté de l'OCX (je dis celà car certaines fonctions ont été implémentées dans l'OCX mais je ne m'en sert pas donc je ne les ai pas ajoutées dans le wrapper).

  12. #12
    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
    Par défaut
    houla tu m'as noyé la
    le projet activex ne génère pas de classe wrapper.
    le projet qui utilise l'activex:
    si le wrapper n'est pas présent l'ajout d'une variable sur le contrôle génèrera le wrapper de classe.

    faire un wrapper de classe manuellement est une très mauvaise idée qui provoquera des problèmes d'appels voir des plantages en cas de cafouillage sur la numérotation des fonctions.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Désolé, c'est surement que ce n'est pas encore très clair pour moi.

    Bon sinon j'ai généré le wrapper à partir du projet qui utilise l'activeX () (j'avais pas compris ça effectivement au début), en faisant, sous 2003, Projet->Add Class->Add MFC Class for Active X.

    J'ai alors un beau fichier .h contenant toutes les fonctions et un fichier .cpp contenant seulement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IMPLEMENT_DYNCREATE(CDPlayerOCX, CWnd)
    C'est en cours de compilation

    Sinon ma question c'était en effet sur la numérotation et je vais essayer d'être plus clair :
    - Dans mon projet activeX, mon fichier .idl liste les fonctions exportées en leur donnant un numéro.
    - Dans mon projet utilisant l'activeX, (si le wrapper est fait manuellement ce qui ne sera plus le cas maintenant que j'ai trouvé ) puis-je implémenter dans le wrapper seulement les fonctions qui m'intéressent. C'est à dire faire par exemple :

    void create()
    {
    InvokeHelper(1,....)
    }

    int isRunning()
    {
    InvokeHelper(4,...)
    }

    Sans implémenter les fonctions entre les deux. Est-ce un problème?

    Merci pour ta patience

  14. #14
    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
    Par défaut
    je ne vois pas de problème à enlever du wrapper généré les fonctions superflues.
    En cas de modifications de l'activex il faudra (à mon avis) toujours repartir de la génération du wrapper par l'assistant pour avoir une interface conforme.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Merci de tes réponses

    Alors j'ai généré le wrapper mais à l'éxécution j'ai des problèmes de types (erreur "Type Mismatch"). Après avoir arrangé tout ça, j'ai toujours le même problème, c'est à dire que les fonctions déjà implémentées auparavant fonctionnent bien mais pas les nouvelles fonctions que j'ai implémentées (erreur "Invalid Number Of Parameters").

    D'où celà pourrait-il venir puisque ça ne semble pas venir de mon wrapper...De mon OCX, de la DLL qu'il encapsule?
    Pourtant j'ai mis une trace dans les fonctions du fichier ocxCtrl.cpp et je n'arrive même pas dans ces nouvelles fonctions (alors que je passe dans les anciennes). Serait-ce un problème de dispatch map?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Arf toujours ce problème de message "Invalid number of parameters" lorsque j'appelle une méthode rajouté à l'OCX.

    Peut-on débugger un activeX histoire de sauter de mon programme appelant à mon activeX lors du débuggage? Si oui, comment faire?

  17. #17
    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
    Par défaut
    Il faut générer l'activex en mode debug .
    et indiquer dans le panneau debug l'exécutable qui l'utilise .
    et lancer le debug trace à partir du projet activex.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Merci.

    Pffiou, ça me donne toujours pas d'indication sur le pourquoi du message d'erreur. J'avoue que là, je vois plus. Y'a t-il quelque chose à faire quand on rajoute des fonctions dans un activeX, autre que de regénérer le wrapper?

  19. #19
    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
    Par défaut
    s'assurer que l'activex enregistré est bien celui auquel on s'attend.
    moi je testerai celui-ci dans un contexte simple avec un projet bidon et je ferai appel aux nouvelles fonctions.
    rassure moi d'un truc quand même ,les nouvelles fonctions dans l'activex tu les a créées avec l'assistant pas en bidouillant le fichier .odl par exemple ?

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 92
    Par défaut
    Citation Envoyé par farscape Voir le message
    s'assurer que l'activex enregistré est bien celui auquel on s'attend.
    moi je testerai celui-ci dans un contexte simple avec un projet bidon et je ferai appel aux nouvelles fonctions.
    rassure moi d'un truc quand même ,les nouvelles fonctions dans l'activex tu les a créées avec l'assistant pas en bidouillant le fichier .odl par exemple ?
    Je réenregistre l'OCX a chaque fois oui.

    J'ai pas de fichier .old
    Si tu veux dire le fichier idl. Oui je l'ai modifié à la main (). Mais j'ai juste rajouté les méthodes. J'ai fait de même dans l'OCXCtrl. En plus je travaille sous Visual Studio 2003 et je ne retrouve pas les consignes du tuto à chaque fois (l'interface change).

    Merci de ton aide.

Discussions similaires

  1. Utilisation du composant ActiveX acroPDF
    Par Faith's Fall dans le forum C++Builder
    Réponses: 3
    Dernier message: 21/08/2009, 19h45
  2. Réponses: 1
    Dernier message: 03/08/2006, 20h40
  3. [VB6]Utilisation d'un activeX
    Par marcou959 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/03/2006, 16h48
  4. Réponses: 1
    Dernier message: 21/02/2006, 17h13
  5. [ActiveX] Peut-on utiliser un Controle ActiveX avec Java
    Par waldo2188 dans le forum Multimédia
    Réponses: 2
    Dernier message: 22/02/2005, 11h39

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