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

Visual C++ Discussion :

Appel d'une boite de dialogue depuis une dll


Sujet :

Visual C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut Appel d'une boite de dialogue depuis une dll
    Bonjour,

    Je suis entrain d'essayer de créer une dll qui sert à ajouter des fonctions à un programme déjà existant.

    Dans une fonction de la dll, je voudrais pouvoir appeler une boite de dialogue servant à régler la valeur d'un paramètre (un champ, une scrollbar, peu importe...).

    Voici le code le plus simple possible de la dll
    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
    /* -----------------------------------------------------------------------
     * Paramics Programmer API    (paramics-support@quadstone.com)
     * Quadstone Ltd.             Tel: +44 131 220 4491
     * 16 Chester Street          Fax: +44 131 220 4492
     * Edinburgh, EH3 7RA, UK     WWW: http://www.paramics-online.com
     * ----------------------------------------------------------------------- */  
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include "programmer.h"
     
     
    // ---------------------------------------------------------------------
    // call api_setup once when the full network has been opened
    // ---------------------------------------------------------------------
    void qpx_NET_postOpen(void)
    {
     
        qps_GUI_printf("Paramics Programmer API: Hello World!\n");
        qps_GUI_addTool("Outil");
    }
     
    // ---------------------------------------------------------------------
    // Called when a layer has been toggled in the Layer Selector.
    // ---------------------------------------------------------------------
    void qpx_GUI_tool(char *name, Bool on)
    {
    	if(strcmp(name,"Outil")==0)	
    	{
    		qps_GUI_printf("Clic sur outil\n");
                    int parametre;//paramètre à regler
    		//ici, appel à une boite de dialogue ?
    	}
    }
    Et je ne sais absolument pas comment faire ! Je bosse depuis ce matin sous Visul C++ 6, alors que j'ai beaucoup plus l'habitude de Borland...

    J'ai trouvé cet exemple de code. Je ne comprends pas cette histoire de AFX_MANAGE_STATE, et surtout, je ne sais pas comment créer l'objet CMyLocalDialog dlg.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    extern __declspec(dllexport) void ShowEditDialog(int &MyData1, int &MyData2)
    {
    	//ensure we are using our own resources
    	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    	CMyLocalDialog dlg;
    	dlg.Arg1 = MyData1; //specific local data for MyLocalDialog
    	dlg.Arg2 = MyData2;
    	dlg.DoModal();
    	MyData1 = dlg.Arg1; //data after processing
    	MyData2 = dlg.Arg2;
    }
    Y a-t-il une solution rapide ?
    Sinon, par quel tutoriel dois-je commencer ?

    Merci d'avance !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    J'ai réussi à avancer un tout petit peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            AFX_MANAGE_STATE(AfxGetStaticModuleState());
     
    	CDialog dlg;
     
    	//dlg.DoModal();
     
    	//dlg.ShowWindow(0);
     
    	dlg.Create(1);
    Ce code est dans une fonction de la dll. Ca compile bien, mais quand j'appelle cette fonction, ça plante dès que j'essaie de faire appel à la fonction DoModal, ShowWindow ou Create. J'obtiens le message d'erreur suivant :

    Microsoft Visual C++ Debug Library

    Debug Assertion Failed !

    Program: D:\Program Files\paramicsv6\Modeller.exe
    File: dlgcore.cpp
    Line: 173

    For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
    Quelqu'un a une idée de l'origine de mon erreur ?
    Est ce que je suis sur le bon forum ?
    Est ce qu'il manque des infos pour résoudre le problème ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    Re-bonjour,

    J'ai compris que CDialog n'est pas à utiliser tout seul, j'ai donc essayé de créer une nouvelle boite de dialogue externe, j'ai cru comprendre qu'il fallait passer par le class wizard, mais il n'est pas accessible dans un projet de dll. J'ai donc fait un nouveau projet app wizard, en choisissant "dialog based", j'ai fait une boite de dialogue "hello_world" que j'ai appelé "VC6_tutoDlg".
    J'ai vu que cette opération m'a généré des fichiers de définition de classe.

    Bon, je suis revenu à mon projet de dll, j'ai rajouté - de manière très sale, mais juste par curiosité - la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "I:/Mes Documents/Developpement/VC6_tuto/VC6_tutoDlg.cpp"
    et un peu plus loin dans une fonction, le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
     
    CVC6_tutoDlg dlg;
    dlg.DoModal();
    Et à ma grande surprise, ça compile !
    Par contre, quand le code est exécuté, il ne se passe rien. La fenêtre n'apparait pas. Mais ça ne plante pas et je n'ai pas le moindre message d'erreur.

    Est-ce que quelqu'un peu me donner un début de piste ?
    Ou même un petit message d'encouragement ?
    Une petite tape compatissante sur l'épaule ?

    Je précise que je travaille... hmm, disons que je bricole avec VC++6 et winXP

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    bonjour

    je pense deja qu'il faut inclure le .h et non le .cpp

    de plus dans un projet DLL sous VC6 tu peux ajouter une boite de dialoque directement, sans passer par un autre projet.

    Cordialement

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    Merci pour ta réponse !

    J'ai essayé d'inclure le .h mais j'ai ce message à la compilation :
    error C2065: 'IDD_TESTDLG_DIALOG' : undeclared identifier
    Et ça me dirait bien de pouvoir ajouter directement une boite de dialogue dans le projet. C'est ce que j'ai essayé de faire mais je ne sais pas comment.
    J'ai bien vu le menu insert->ressource->dialog qui me fait apparaitre une boite de dialogue dans l'éditeur, mais au moment d'enregistrer, on me demande d'enregistrer un fichier script.rc dont je ne sais que faire ensuite.
    Et je ne sais donc pas plus comment appeler cette boite de dialogue depuis la dll... Enfin je n'ai pas accès au menu ClassWizard.

    Bref, je nage dans la semoule, je pédale dans le paté...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Bonjour

    Ton projet est bien du type MFC Appwizard (DLL) dans le choix du projet au depart ou c'est une DLL win 32 ?

    Dans le premier cas tu peux inclure directement la dialog

    Cordialement

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    Je ne sais pas quel est le type de mon projet. Un squelette de projet est fourni avec le logiciel pour lequel il est prévu (il s'agit de Paramics, un logiciel de simulation de trafic routier), je n'ai qu'à ouvrir le workspace et tout est bien paramétré.

    J'ai essayé de chercher dans les réglages, et j'ai trouvé dans "project setting", onglet "general" : "use MFC in a shared DLL".

    Est ce que ça répond à la question ?

    Si oui, comment je fais dans la pratique pour inclure directement une boite de dialogue ? Par quel menus passer ? Quelles options ?

    Merci pour tout !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    RE

    Si tu utilise les MFC tu fait normalement
    Insert- Ressource -dialog -new
    Tu va arriver dans l'editeur de ressource ou tu pourras mettre les controles que tu veux dedans.
    En quittant l'editeur il va te dire que cette dialog n'a pas de classe et t'ouvriras le wizard pour creer une classe et creer de ce fait le .h et le .cpp dans ton projet pour cette dialogue

    cordialement

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    J'ai fait inserer->ressources->dialog->new
    J'ai effectivement un éditeur de boite de dialogue qui apparait, je mets un objet Edit dedans, je ferme l'éditeur, et là, il me demande si je veux enregistrer un fichier script.rc, et à aucun moment il ne me crée de fichier .h ou .cpp.

    Et toujours le menu contextuel avec AppWizard en grisé.

    J'ai fait une erreur dans un coin ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    J'ai fait la même manip dans un projet standard (appWizard avec MFC), et là, effectivement, on me demande si je veux créer une classe pour cette boite de dialogue, et l'application me crée un .h et un .cpp. Je peux ensuite utiliser ces classes et faire apparaitre une boite de dialogue.
    En désespoir de cause, j'ai inclus ce .h et .cpp dans le projet de ma DLL, j'ai mis le même code pour faire apparaitre la boite de dialogue, ça compile sans problème, mais à l'execution, rien ne se passe, aucune boite de dialogue n'apparait, ça ne plante pas, et je n'ai pas de message d'erreur...

    C'est un peu frustrant, j'ai l'impression de tourner en rond.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Points : 347
    Points
    347
    Par défaut
    Re

    Le .h et le .cpp ne suffise pas, il te faut le fichier de ressources ou se situe ta fenetre.
    Mais la je ne voit pas comment le mettre dans ta DLL existante.
    A mon avis tu prend le probleme a l'envers, l'ossature du projet doit etre la DLL ou il y a la fenetre et tu vient ajouter les fonction de ta DLL precedente.

    Cordialement

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    Points : 111
    Points
    111
    Par défaut
    Ca ne marche pas plus avec le resource.h (un brutal #include)

    Et je n'arrive toujours pas à ajouter de fenêtre à la dll directement dans le projet. Le programme me propose au mieux d'enregistrer un fichier script.rc, et je ne sais pas à quoi ça sert. Le menu classWizard est toujours inaccessible dans ce projet. Est ce que je peux modifier ce projet pour changer ça ?

    Merci pour tout !

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/04/2015, 08h28
  2. Réponses: 1
    Dernier message: 27/08/2011, 07h28
  3. Réponses: 6
    Dernier message: 15/05/2007, 18h54
  4. Réponses: 4
    Dernier message: 30/03/2007, 11h12
  5. Réponses: 17
    Dernier message: 18/10/2005, 21h19

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