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

Delphi Discussion :

Utilisation d'une variable publique dans une DLL


Sujet :

Delphi

  1. #1
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut Utilisation d'une variable publique dans une DLL
    J'utilise une DLL devant accéder aux données.
    Elle inclut donc un DataModule.
    Le DataModule est initialisé à l'ouverture de la DLL et je voudrais savoir le rendre Global pour que les différentes unités le voient sans que j'ai à le repasser en paramètre.

    Actuellement mon code ressemble à cela
    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
    Var
       DM    : TDM;
       oForm : ToFormS01_ECIV;
     
     
    {$R *.RES}
    Procedure xxx(P1        : String;
                  var Objet : TPanel);
    Var
       oPanel: TPanel;
       oForm : Tform;
     
    Begin
       DM := TDM.Create(Nil);
       DM.DM_Initialisation;
       oForm := TW_Test.Create(Application);
       oForm.ParentWindow := Objet.Handle;
       oForm.Align        := alClient;
       oForm.Show;
    End;
     
    Exports xxx;
     
    begin
    end.
    Le problème est qu'au niveau de la Form la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       With l_ADO_Query Do Begin
            Connection := DM.DM_ADO_Connection;
    DM est égal à Nil

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Je suppose que tu as bien chargé la dll? Utilises-tu du just in time auqeul cas, si elle trop logtemps inutile, a dll est peu être déchargée.

    Es-tu sur qu'il n'y a pas eu d'exception dans ta dll, qui aboutit aussi à DM == nil?

    Voilà quelques pistes.

  3. #3
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Il ne faut pas passer le handle de l'application à la DLL?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  4. #4
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    La DLL fontionne bien.
    Elle affiche les informations, ouvre bien le dataModule et charge les informations dont elle a besoin.
    En parametre elle reçoit juste le handle d'un panel dans lequel elle doit travailler.

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Le handle du panel est-il valide en dehors du processus qui le detient? Il me semble que ce n'est pas une certitude.

    Le handle de l'application, l'est mais pour les autres...je ne sais plus.

    Tu peus nous faire un screenshot du message d'erreur?

  6. #6
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    J'ai ajouté le Handle de l'application dans les paramètres attendus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Procedure xxx(    P1    : String;
                  var Objet : TPanel;
                      Appli : HWND);
    Par contre j'ai un premier problème : HWND est de type inconnu. A lire l'aide j'avais compris qu'il fallait un Uses de TForm mais apparament ce n'est pas le cas.

    Ma seconde question : une fois que j'aurai le handle de l'application comment faut-il il appeler le dataModule ?

    Merci d'avance

  7. #7
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    Si mes souvenirs sont exact le handle de ton application s'obtient comme ceci :

  8. #8
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Application.handle
    Ca OK. Ce que je n'arrive pas à faire c'est la déclaration.
    Ici HWND est de type inconnu et je ne sais quel uses indiquer.


  9. #9
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    J'ai trouvé : HWND est dans l'Unité Windows

    La question qui me reste : avec le handle de l'application comment faut-il appeler le Data Module ?

  10. #10
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 289
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 289
    Points : 1 940
    Points
    1 940
    Par défaut
    Ctrl+clic sur Application.Handle puis sur HWND, et on se retrouve sur l'unité Windows.



    Edit: Grillé.

    Pour le Handle de l'application, je pense qu'il faut faire une fonction de cette façon:
    http://www.developpez.net/forums/sho...3&postcount=21
    ou
    http://www.developpez.net/forums/showthread.php?t=79597
    Il y avait aussi d'autres post là-dessus, mais je ne les retrouve pas
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2022

  11. #11
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Ctrl+clic sur Application.Handle puis sur HWND, et on se retrouve sur l'unité Windows.
    Ca marche une fois que la Unit est déclarée. Sinon Deplhi dit qu'une erreur de syntaxe l'empêche de trouver.

    Ce qui me reste est le pointage sur le DataModule de l'application en utilisant le Handle que je viens de passer en paramètre.
    Et ca je ne sais pas le faire

  12. #12
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Tu peux clarifier ton dernier post, je ne comprends pas ta question.

    Tu as essayer de jouer en pas à pas l'init de ta dll et vérifier les valeurs passées et obtenues? Ou en utilisant un fichier de log.

  13. #13
    Membre confirmé

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Il n'y a pas de plantage
    Dans l'EXE le datamodule a été ouvert. il s'appelle DM
    Dans ma DLL j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Procedure xxx(    P1    : String;
                  var Objet : TPanel;
                      Appli : HWND);
    Je voudrais savoir comment appeler DM à l'intérieur de la dll.
    Je pense qu'il faut utiliser le handle de l'application mais je ne connais pas la syntaxe.

  14. #14
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    J'ai compris, désolé mais jusque là j'été à côté!

    A mon avis il y a plus simple : CreateFileMapping, pour partager l'objet avec la dll. Tu stockes DM dans un semaphore, nommé et la dll peux ansi récupéré l'objet initialisé.

    Le problème du Handle, c'est que dans ta DLL, tu devras te pelucher l'API WIN 32 pour retrouver ton objet...très long à mettre en place.

    Dans la FAQ Delphi, ou dans les tutos, il y a une rubrique sur CreateFileMapping.

    Hum, peut être qu'un simple TSLData suffirait. Malheureusement, tout le code de mon cru est propriétaire et chez mon ancien employeur, je n'ai pas d'exmple à te donner.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  2. [PHP-JS] Récupérer une variable JS dans une variable PHP
    Par Perceuse-Killer dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2008, 15h34
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h12
  4. [PHP-JS] mettre une variable javascript dans une variable php
    Par Mounr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2007, 09h09
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

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