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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    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 confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 118
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    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

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