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

Langage Delphi Discussion :

Paramètres procédure DLL


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 42
    Points
    42
    Par défaut Paramètres procédure DLL
    Bonjours les amis,

    je voulais savoir es-ce que passer un paramètre de type TForm dans une procédure DLL, pose un problème ?

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour

    Cf. la discussion suivante dans le forum Lazarus :
    Problème d'affichage d'une fiche à partir d'une DLL

    En gros, tant que ton exe et ta dll sont générés par la même version de l'outil de développement, il ne devrait pas y avoir de problème, Dans les autres cas, tu joues à la roulette russe.
    En fait, il faut éviter de passer autre chose que des paramètres simples dans les procédures et fonctions exportées par une dll ou alors il faut utiliser des mécanismes à bases d'interfaces comme l' a indiqué Paul Toth dans le sujet référencé ci dessus.
    --
    Philippe.

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    tant que ton exe et ta dll sont générés par la même version de l'outil de développement, il ne devrait pas y avoir de problème
    Sans rien en connaître, ne vaut-il pas mieux dans ce cas utiliser les paquets ?

  4. #4
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Sans rien en connaître, ne vaut-il pas mieux dans ce cas utiliser les paquets ?
    Un paquet n'est rien d'autre qu'une dll. La remarque vaut pleinement.

    Pour s'en rendre pleinement compte, il suffit d'essayer d'utiliser un paquet compilé pour Delphi 7 avec Delphi 2006+ et on verra apparaitre un message très similaire à :
    "Ne peut charger le paquet VCL70. Il contient l'unité 'ToolsAPI' qui est également contenu dans le paquet VCL100"
    --
    Philippe

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Lit ce sujet : DLL String Pourquoi ça marche sans BORLNDMM.DLL
    C'était la première fois que je tentais du String et TForm sans BORLNDMM.DLL pour voir ce que cela fait (avant soit j'utilisais un Framework qui encapsulait cela, soit mes DLL étaient totalement indépendantes respectant un style "C")
    On est supris de voir tout ce qui peu fonctionner sans BORLNDMM.DLL, en fait tant que l'EXE ne manipule pas directement l'objet de la DLL, ça passe
    Si veux que l'exe modifie lui même l'objet de la DLL sans passer par des méthodes dédiées ShareMem\BORLNDMM.DLL ou FastShareMem, ou SimpleShareMem sont indispensables (cela dépend de ta version, D2 et D7, il me semble, ça va être DUR DUR !)

    J'ai pratiqué l'échange de TForm, mais masqué !
    En Delphi 6 : La DLL fourni un ensemble de procédures et types, utilise un paramètre qui contient un Pointer, la DLL sait que c'est une TForm, l'EXE n'en sait rien, il DOIT utiliser les procédures de la DLL pour l'utiliser,

    En C++Builder 2007, la DLL fourni un interface (classe abstraite pure) avec un ensemble de méthode, idem toute manipulation passe par ces méthodes, la DLL est une boite noire !

    Tant que tu respecte ce type de fonctionnement, tu n'auras pas de mauvaise surprise liée au partage d'objet


    Sinon, si tu le peux fourni plutôt des Handles de Control !
    Encore ton histoire de clavier et de DLL, tu n'as pas besoin de TForm (mais juste d'un AllocateHWnd
    Relit la Réponse de AndNotOr !!!

    Au boulot, on va essayer la roulette russe entre C++Builder 2007 et XE2, on va voir ce qu'il faut alléger pour faire cohabiter des BPL, DLL et EXE dans les deux versions qui échange des interfaces (ça c'est propre, j'utilise même des BSTR) mais une exception, j'ai passé un TWinControl pour ancrer des TForm de la DLL via la propriété Parent dans un Panel de l'EXE (l'effet étant nettement meilleur à _WINDOWS_::SetParent() pour la gestion du focus ...) et là c'est le suspens !
    Et pour le reste de code, j'ai vu des horreurs, et j'ai peur sur la comparaison de nom de classe (d'un côté ShortString et de l'autre ... UnicodeString !)

  6. #6
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 42
    Points
    42
    Par défaut
    Bonjour à vous tous,

    je vous remercie pour vos suggestions.
    Bon ya beaucoup à lire ce weekend, je vous tiendras au courant de l'histoire du clavier et de la DLL

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    tu peut m'explique ce que ta dll va faire avec un paramétre type TForm???

  8. #8
    Membre du Club
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Bon pour le plaisir de edam :

    j'en ai 2 procédures (je précise toujours, développées par AndNotOr), qui permettent de gérée un message WM_INPUT :

    la première, prépare la structure d'enregistrement :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    procedure TFormTest.FormActivate(Sender: TObject);
    var
      RawsList   :array of TRawInputDeviceList;
      RIDList    :array[0..0] of TRawInputDevice;
      RIDInfo    :TRidDeviceInfo;
      DeviceName :string;
      Count      :cardinal;
      Size       :dword;
      i          :integer;
     
    begin
      //Détermine le nombre de device
      GetRawInputDeviceList(nil, Count, SizeOf(TRawInputDeviceList));
     
      if Count > 0 then
      begin
        //Récupère la liste des devices
        SetLength(RawsList, Count);
        GetRawInputDeviceList(@RawsList[0], Count, SizeOf(TRawInputDeviceList));
     
        for i := 0 to Count -1 do
        begin
          //Récupère le type du device
          Size := SizeOf(TRidDeviceInfo);
          RIDInfo.cbSize := Size;
          GetRawInputDeviceInfo(RawsList[i].hDevice, RIDI_DEVICEINFO, @RIDInfo, Size);
     
          //Ne concerve que les claviers
          case RIDInfo.dwType of
            RIM_TYPEKEYBOARD : begin
                                 //Nom interne du device
                                 GetRawInputDeviceInfo(RawsList[i].hDevice, RIDI_DEVICENAME, nil, Size);
                                 SetLength(DeviceName, Size);
                                 GetRawInputDeviceInfo(RawsList[i].hDevice, RIDI_DEVICENAME, @DeviceName[1], Size);
     
                                 //Ne prend pas en compte les infos pour Terminal Server
                              //   if StartsStr('\??\Root', DeviceName) then Continue;
     
                                 //Ajout à la liste (Object est rempli avec hDevice pour contrôle dans WM_INPUT)
                             //    CheckListBox1.AddItem(GetDeviceDesc(DeviceName), pointer(RawsList[i].hDevice));
                               end;
          end;
        end;
     
        //Tous actif par défaut
     //   CheckListBox1.CheckAll(cbChecked);
     
        //S'enregistre pour la réception des messages clavier
        RIDList[0].usUsagePage := $01;
        RIDList[0].usUsage     := $06;
        RIDList[0].dwFlags     := RIDEV_NOLEGACY;  //Ne génère pas WM_KEYDOWN, WM_KEYUP !!!
        RIDList[0].hwndTarget  := Handle;
     
        if not RegisterRawInputDevices(@RIDList[0], Length(RIDList), SizeOf(TRawInputDevice)) then
          RaiseLastOSError;
      end;
     
    end;
    La seconde, gére le WM_INPUT :
    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
    procedure TFormTest.WMInput(var Message :TMessage);
    var
      Data :PRawInput;
      Size :dword;
     // i    :integer;
     
    begin
      Message.Result := 1 ;    //Spécifier la valeur retournée a windows en réponse à la gestion du WM_INPUT
     
      if Assigned(ActiveControl) then
      begin
        GetRawInputData(Message.LParam, RID_INPUT, nil, Size, SizeOf(TRawInputHeader));
        GetMem(Data, Size);
     
        if GetRawInputData(Message.LParam, RID_INPUT, Data, Size, SizeOf(TRawInputHeader)) = Size then
        begin
          //Est-ce un clavier ?.. (ça devrait, mais pour être sûr !)
          if Data.header.dwType = RIM_TYPEKEYBOARD then
          begin
     
         //   i := FormParam.CheckListBox1.Items.IndexOfObject(pointer(Data.header.hDevice));
     
     
            if Data.header.hDevice = 15794249 then
            begin
              //...oui => Traitement du WM_KEYDOWN
              if Data.keyboard.Message = WM_KEYDOWN then
                ActiveControl.Perform(WM_CHAR, Data.keyboard.VKey, 0);
     
              Message.Result := 0;
            end;
          end;
        end;
      end; // if Assigned(ActiveControl) then
    end;
    Je veux les mettres dans une DLL, pour les séparées de la fiche où je voulais faire la gestion de WM_INPUT

Discussions similaires

  1. Problème Paramètres procédure pl/sql
    Par tofke dans le forum PL/SQL
    Réponses: 4
    Dernier message: 12/07/2007, 15h41
  2. paramètre procédure stockée
    Par joe.lindien dans le forum Requêtes et SQL.
    Réponses: 19
    Dernier message: 20/04/2007, 12h43
  3. Passage de paramètres avec DLL Delphi
    Par GroovyBaby dans le forum C#
    Réponses: 2
    Dernier message: 08/03/2007, 14h51
  4. Réponses: 5
    Dernier message: 01/03/2007, 17h19
  5. [SQLSERVER]Pb passage paramètre procédure stockée
    Par galinijay dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/08/2005, 11h59

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