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 :

Problème création 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 Problème création DLL
    Bonjour à tous,

    Voici un bout de code Delphi developpé par Andnotor,

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, CheckLst, JwaWinUser, Registry, StrUtils;
     
    type
      TForm1 = class(TForm)
        CheckListBox1: TCheckListBox;
        Memo1: TMemo;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        function GetDeviceDesc(aName :string) :string;
        procedure WMInput(var Message :TMessage); message WM_INPUT;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    //Description du Device (Base des registres)
    function TForm1.GetDeviceDesc(aName :string) :string;
    var
      Reg :TRegistry;
     
    begin
      //Supprime \??\ et le GUID de fin
      aName := Copy(aName, 5, LastDelimiter('#', aName) -5);
      //Remplace # par \
      aName := StringReplace(aName, '#', '\', [rfReplaceAll]);
     
      Reg := TRegistry.Create;
      try
        Reg.RootKey := HKEY_LOCAL_MACHINE;
     
        if Reg.OpenKeyReadOnly('SYSTEM\CurrentControlSet\Enum\' +aName)
        then Result := Reg.ReadString('DeviceDesc')
        else Result := '<Unknown>';
      finally
        Reg.Free;
      end;
    end;
     
    procedure TForm1.FormCreate(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;
     
    procedure TForm1.WMInput(var Message :TMessage);
    var
      Data :PRawInput;
      Size :dword;
      i    :integer;
     
    begin
      Message.Result := 1;
     
      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
            //...oui. Ce handle est dans notre liste ?..
            i := CheckListBox1.Items.IndexOfObject(pointer(Data.header.hDevice));
     
            //...oui. Est-il coché ?..
            if (i > -1) and CheckListBox1.Checked[i] 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;
    end;
     
    end.
    Je voulais le convertir en une DLL, Es-possible ?, car mes premiers essaies ont échoué:cette ligne par exemple "RIDList[0].hwndTarget := Handle;" donne un identificateur non déclaré.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 785
    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 785
    Points : 5 916
    Points
    5 916
    Par défaut
    Citation Envoyé par sniperpro Voir le message
    Je voulais le convertir en une DLL, Es-possible ?, car mes premiers essaies ont échoué:cette ligne par exemple "RIDList[0].hwndTarget := Handle;" donne un identificateur non déclaré.
    Ben oui, c'est possible...

    Après, il te faut regarder le source de l'unité contenant le type TRawInputDevice !
    C'est là que sont décrites les propriétés du type voire des méthodes et autres s'il s'agit d'une classe d'objet...
    --
    Philippe.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Dans la DLL, il te faut déjà commencer par créer une fonction que tu dois mettre dans la section export !

    Le Handle est une propriété du TForm1, tu dois semble-t-il conserver la TForm puisque tu as besoin du clavier (donc d'un Control pouvant recevoir le Focus)

    Tu devrais consulter la MSDN sur RegisterRawInputDevices

    Quel le but ?
    Si tu veux capturer le clavier dans une DLL, utilise un Hook sur WM_KEY ...

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Il ne devrait pas y avoir besoin d'export si la DLL ne fait que traiter Raw Input. Son chargement/déchargement suffit.

    • Un fenêtre message-only (AllocateHWnd) créée depuis DLL_PROCESS_ATTACH chargée du traitment de WM_INPUT.
    • Récupérer le handle du champ par GetGUIThreadInfo.
    • Remplacer ActiveControl.Perform par Post(Send)Message.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    C'est dommage, on pourrait penser qu'il y aurait une fonction StartInput et
    StopInput, et que l'on puisse définir une CallBack pour l'exe appelant puisse profiter de ce qui passe dans la DLL !
    Cette Callback remplacerait les ajout dans la TCheckListBox (qui pourrait rester côté exe appelant)
    Cette même Callback servirait aussi pour tester la précense dans la TCheckListBox
    Un paramètre indiquerait si c'est un Add ou IndexOf ...

    Pour DLL_PROCESS_ATTACH (qui d'ailleurs, n'ai jamais reçu en Delphi si l'on utilise System.DLLProc) contrairement au DllEntryPoint de C++Builder
    A noter que la Doc XE2 de System.DLLProc est vide pour le moment, cela aurait-il évolué ???
    Cette méthode de passer par Initialization\Finalization manque un peu de souplesse pour le paramètrage (passer par un fichier ini ?)

    Pour le reste, on va voir la réponse de SniperPro, en 3 phrases de Andnotor, il a de quoi chercher
    Surtout que je suis pas convaincu qu'il est a compris le code, et surtout que l'on aurait aimé avoir la version DLLisée du code !

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 764
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Créer une DLL pour ça est de toute façon une complication inutile. En faire un composant, je comprendrais mieux...

  7. #7
    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
    Merci à vous tous pour vos réponses,

    Bon franchement le programme où je voulais intégré cette fonction de gestion de WM_INPUT, est écrit en Delphi2 , La DLL est la seule solution que j'ai trouvé.

    Bah, pour Andnotor, je cherche pas la solution la plus optimisée, d'autant plus qu'une solution simple et fonctionnelle. Surtout qu'il me faut encore du temps pour comprendre ton code.

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Citation Envoyé par sniperpro Voir le message
    Merci à vous tous pour vos réponses,

    Bon franchement le programme où je voulais intégré cette fonction de gestion de WM_INPUT, est écrit en Delphi2 , La DLL est la seule solution que j'ai trouvé.

    Bah, pour Andnotor, je cherche pas la solution la plus optimisée, d'autant plus qu'une solution simple et fonctionnelle. Surtout qu'il me faut encore du temps pour comprendre ton code.
    AAaaah ! Delphi 2 ! quel beau produit

    à vu de nez il ne lui manque que les tableaux dynamiques...par la mort à coder avec un GetMem()

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Quel œil ! Paul !

    Voir ce sujet pour un exemple de GetMem pour les array de D3 , en Delphi 2 ça doit fonctionner !

    sniperpro, tu peux fournir le code de la version DLL ?
    Tu as un exe en Delphi 2 et tu crées une DLL avec un Delphi plus récent pour tous les éléments manquants ?
    Ou ta DLL et ton EXE sont en D2, et dans ce cas ... euh pourquoi une DLL effectivement ?

  10. #10
    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 ShaiLeTroll,

    C'est trés intérésente l'histoire du GetMem(), c'est à révisée au temps libre

    Tu as un exe en Delphi 2 et tu crées une DLL avec un Delphi plus récent pour tous les éléments manquants ?
    Oui, c'est exactement ça, j'en ai la source du programme en Delphi2, et je voulais créer une DLL pour pouvoir utiliser le code plus haut créer avec Delphi7.
    Bon pour le CheckListBox je peux m'en débarrasé, j'en ai pas besoin

  11. #11
    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
    La plus simple solution que j'ai trouvé est "d'injectée" la fiche dans la DLL, c'est à dire; si la fiche est nomée formdll, j'ajoute son unité correspondante dans les uses de la DLL et je crée cette procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure CreeFiche; stdcall ;
    begin
     
      Application.CreateForm(TFormdll, Formdll);
      Formdll.show ;
    end;
     
    exports CreeFiche ;
    Mais c'est pas Pro .

Discussions similaires

  1. Problème création dll
    Par 0_Azerty_0 dans le forum Débuter
    Réponses: 12
    Dernier message: 25/10/2013, 18h01
  2. CEGUI, Problème création .dll
    Par Erwan28250 dans le forum Ogre
    Réponses: 7
    Dernier message: 17/03/2013, 22h54
  3. Problème Création DLL
    Par Fabien25C dans le forum Débuter
    Réponses: 1
    Dernier message: 25/11/2009, 13h57
  4. Problème création de DLL avec CString
    Par loupdeau dans le forum MFC
    Réponses: 3
    Dernier message: 21/07/2005, 20h55
  5. Problème création de DLL
    Par monsieur.voie.lactee dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/08/2003, 16h56

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