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

C++Builder Discussion :

DLL et MainForm je suis perdu !


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Par défaut
    Effectivement tu as raison, j'ai pu remarqué que lorsque l'instruction suivante est exécuté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->Handle = hwnd;
    ca fonctionne avec la compilation des paquets, mais pas sans, cad que la valeur de hwnd n'est jamais attribué a Application->Handle, elle reste inchangé !

    C'est a devenir fou

  2. #2
    Membre averti
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Par défaut
    Salut a tous,

    J'ai enfin trouvé la solution au problème de la mdichild qui est dans la DLL (Form2), voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int __stdcall LoadForm(TApplication *app)
    {
            Oldapp = Application;
            Application = app;
            BD = NULL;
            BD = new TBD(Application);
            ShowWindow (BD->Handle , SW_SHOW);
            return (0);
    }
    Comme vous pouvez le voir, je passe en paramètre un TApplication *app, je remplace le Application de la DLL, que je sauvegarde d'abord, par celui qui est passé en paramètre, et là tout fonctionne avec ou sans les fameux paquets !!!

    Par contre autre souci, je cherche depuis quelques heures déjà mais je ne trouve pas si vous avez des pistes a me proposer ...

    Voilà le problème, en fait ma form2 qui est dans la DLL contient des fonctions par exemple ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm2::test()
    {
      ShowMessage("Hello");
    }
    Simple jusque là ! Mais pourtant quand j'essaie d'accèder a un contrôle de la form2, peu importe le contrôle un bouton un tedit ..., pas de problème, par contre si j'essaie de faire un appel a la fonction, la compilation echoue en me disant "unresolved external __fastcall 'TForm2::test() ..."

    Est-ce que c'est possible de faire appel a cette fonction depuis l'extérieur ? Est-ce moi qui ai oublié quelque chose ?

    Si vous avez des pistes, je suis preneur

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Salut
    Simple jusque là ! Mais pourtant quand j'essaie d'accèder a un contrôle de la form2, peu importe le contrôle un bouton un tedit ..., pas de problème, par contre si j'essaie de faire un appel a la fonction, la compilation echoue en me disant "unresolved external __fastcall 'TForm2::test() ..."

    Est-ce que c'est possible de faire appel a cette fonction depuis l'extérieur ? Est-ce moi qui ai oublié quelque chose ?
    Qu'appelles-tu faire appel à la fonction de l'extérieur, dans le programme appelant ta Dll ? Dans ce cas il y a, il me semble un problème de conception, non ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre averti
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Par défaut
    Oui je parle effectivement du programme appelant la DLL, pour les composant je n'ai pas de souci, c'est sur les fonctions uniquement !

    Qu'entend tu par problème de conception ?

    Est-ce que ce ne serait tout simplement pas possible ?

  5. #5
    Membre averti
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Par défaut
    Tout compte fait, je me demande si c'est vraiment possible d'utiliser des fonctions d'une class se trouvant dans une DLL !!!

    Mais pourquoi les composants ne posent pas de problème a ce moment là ?

    Il me semble avoir vue quelque chose concernant les fonctions d'une class dans les DLL, mais je ne retrouve pas ou ?

    Si quelqu'un a une idée ...

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Le programme appelant n'a pas à mon avis à connaître les détails de l'implémentation de la Form de la Dll. Topujours à mon avis, il devrait demander à la Dll d'effectuer certaines actions mais sans référence à la Form par exemple
    Dans le programme appelant :
    la fonction étant définie dans la Dll par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Action1(void)
    {
       Form1->Ok();
    }
    Il faut bien sur ajouter les déclarations permettant d'exporter Action1.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre averti
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Par défaut
    Oui j'avais quelque doute, mais vu que je peux accéder aux variables et aux composant, je pense qu'il doit bien avoir un moyen d'accéder aux fonctions également, mais bon ...

    Si je doit procéder comme tu dit, je pense que j'ai du pain sur la planche, vue que c'est effectivement la seule solution qui fonctionnerait pour l'instant, vue le nombre de modules que je souhaite mettre en DLL, j'en ai pour au moins deux semaines

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 420
    Par défaut
    Salut !

    Tu es bien sûr d'avoir enregistré les modifs puis reconstruit la dll?
    Chez moi ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void __fastcall TForm2::FormClick(TObject *Sender)
    {
    MessageCoucou();
    }
     
    void __fastcall TForm2::MessageCoucou() //déclarée en public
    {
    Application->MessageBox("Il faut que je passe l'aspirateur ! Mais...!",
                            "Test",
                            MB_OK | MB_ICONEXCLAMATION);
    }
    Par contre, moi j'ai eu un gros bug à la fermeture du programme !
    J'ai du rajouter ceci dans la dllEntryPoint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(reason == DLL_PROCESS_DETACH)
        {
        Application = Oldapp;
        }
    Autrement pour titiller la MDIForm, il suffit de caster par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application->MainForm->...;
    Donc tout ce qui relève de TForm (et non de Form1), comme Tile()... etc..


    A plus !

  9. #9
    Membre averti
    Inscrit en
    Août 2003
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 17
    Par défaut
    Tu es bien sûr d'avoir enregistré les modifs puis reconstruit la dll?
    Oui, mais en fait il s'agit d'appeller la fonction qui se trouve dans Form2 depuis Form1 (l'EXE) !

    Mais j'ai finalement trouvé, en fait tout simplement grace au tuto. de LFE, j'avais la réponse sous les yeux depuis un moment, il "suffit juste" d'exporter la class qui se trouve dans la Form2, en mettant dans le .H ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef __DLL__
    #define IMPORT_EXPORT __declspec(dllexport)
    #else
    #define IMPORT_EXPORT __declspec(dllimport)
    #endif
    Simple et efficace, car ca fonctionne

    Par contre pour ca :
    Par contre, moi j'ai eu un gros bug à la fermeture du programme !
    J'ai du rajouter ceci dans la dllEntryPoint :
    J'ai eu le même problème a un moment donnée, je l'ai résolu en mettant ma compil en mode Release

    Plutôt bizarre non ?

    Donc maintenant tout fonctionne, enfin je fait encore quelques modifs et je vous poste le code que j'ai utilisé pour les différents problème que j'ai eu.

    Merci a tous et a bientôt.

    PS: Bravo LFE pour le tuto. sur les DLL sans lui je n'aurais rien fait du tout !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Je suis perdu avec le type *wstring d'une DLL C++
    Par alain8550 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 14/04/2010, 21h48
  2. [ODBC] Je suis perdu avec ODBC
    Par Nowhere dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 19/05/2006, 08h50
  3. [Tableaux] aide je suis perdu
    Par covin85 dans le forum Langage
    Réponses: 12
    Dernier message: 14/04/2006, 17h56
  4. [Architecture] EJB ou pas EJB ? Je suis perdu ...
    Par n!co dans le forum Java EE
    Réponses: 18
    Dernier message: 26/01/2006, 18h21
  5. RAM DDR, PC3200, 333Mhz , 400Mhz je suis perdu
    Par ahage4x4 dans le forum Composants
    Réponses: 2
    Dernier message: 08/12/2005, 17h52

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