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 :

[D2009] DLL - Comment faire marché un retour en TStringlist


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut [D2009] DLL - Comment faire marché un retour en TStringlist
    Bonjour,

    J'essai d'apprendre à utiliser les DLLs.

    J'ai souvent dans mes programmes un fichier Commun.pas comportant plusieurs fonctions et procédures.

    Voici ce que j'essai de faire :

    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
    library Commun;
     
     
    { Remarque importante concernant la gestion de mémoire de DLL : ShareMem doit
      être la première unité de la clause USES de votre bibliothèque ET de votre projet
      (sélectionnez Projet-Voir source) si votre DLL exporte des procédures ou des
      fonctions qui passent des chaînes en tant que paramètres ou résultats de fonction.
      Cela s'applique à toutes les chaînes passées de et vers votre DLL --même celles
      qui sont imbriquées dans des enregistrements et classes. ShareMem est l'unité
      d'interface pour le gestionnaire de mémoire partagée BORLNDMM.DLL, qui doit
      être déployé avec vos DLL. Pour éviter d'utiliser BORLNDMM.DLL, passez les
      informations de chaînes avec des paramètres PChar ou ShortString. }
     
    uses
      ShareMem,
      SysUtils,
      Classes,
      Windows,
      Dialogs,
      Forms,
      ShlObj,
      ActiveX,
      Controls,
      Registry,
      Graphics,
      Math;
     
    Var
      BtnDown: boolean;
     
     
    {$R *.res}
     
    procedure GetFileInfo(const FileName: string;liste: TStringList);register;
    const
      VersionInfo: array [1..8] of string
          = ('FileDescription', 'CompanyName'   , 'FileVersion',
             'InternalName'   , 'LegalCopyRight', 'OriginalFileName',
             'ProductName'    , 'ProductVersion');
      VersionInfoFr: array [1..8] of string
          = ('Description', 'Entreprise'   , 'Version : ',
             '' , 'Marque Légale', 'Nom du fichier d''origine',
             '' , 'Version du produit');
    var
      Handle   : DWord;
      Info     : Pointer;
      InfoData : Pointer;
      InfoSize : LongInt;
      DataLen  : UInt;
      LangPtr  : Pointer;
      InfoType : string;
      i        : integer;
    begin
      { Demande de la taille nécessaire pour stocker les infos de Version}
      InfoSize:=GetFileVersionInfoSize(PChar(FileName), Handle);
      if (InfoSize > 0) then
      begin
        { Réservation de la mémoire nécessaire}
        GetMem(Info, InfoSize);
     
        try
          if GetFileVersionInfo(PChar(FileName), Handle, InfoSize, Info) then
          begin
            for i:= 1 to 8 do
            begin
              InfoType := VersionInfo[i];
              if VerQueryValue(Info,'\VarFileInfo\Translation',LangPtr, DataLen) then
                InfoType:=Format('\StringFileInfo\%0.4x%0.4x\%s'#0,[LoWord(LongInt(LangPtr^)),
                                             HiWord(LongInt(LangPtr^)), InfoType]);
              if VerQueryValue(Info,@InfoType[1],InfoData,Datalen) then
                liste.add(VersionInfoFr[i]+strPas(Pchar(InfoData)));
            end;
          end;
        finally
          FreeMem(Info, InfoSize);
        end;
      end;
    end;
     
    Exports
      GetFileInfo;
     
    begin
     
    end.
    PS : j'ai un peu retoqué cette procédure

    Voilà sont utilisation :
    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
    unit TestDLL;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, sComboBox;
     
    type
      TForm1 = class(TForm)
        OpenDialog1: TOpenDialog;
        sComboBox1: TsComboBox;
        Button1: TButton;
        procedure sComboBox1DropDown(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    procedure GetFileInfo(const FileName: string;liste: TStringList);register;external 'Commun.dll';
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Information: TStringlist;
      i: Integer;
    begin
       Information := TStringList.Create;
       try
         GetFileInfo(sComboBox1.Text,Information);
         for i := 0 to Information.Count - 1 do
         begin
           showmessage(information.Strings[i]);
         end;
       finally
         Information.Free;
       end;
     
    end;
     
    procedure TForm1.sComboBox1DropDown(Sender: TObject);
    begin
        if OpenDialog1.Execute then
        Begin
           sComboBox1.Text := OpenDialog1.FileName;
     
        End;
    end;
     
    end.
    PS : Mon Projet comporte bien ShareMem en début des uses.

    Mes problèmes :
    Rien ne se passe dans l'état actuel et je ne sais pas pourquoi.
    Si je retire ShareMem je ne rentre même pas dans ma boucle, count vaut 0.

    Donc où je pèche ? pouvez-voius m'aider ?

    Et comment puis-je éviter l'utilisation de ShareMem, je sais qu'il faut utiliser les Pchar pour les strings, mais je ne sais pas vraiment où et comment faire.

    Merci pour vos lumières.

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    En faite sa marche. Je prenais des fichiers qui ne comportait pas les infos necessairs.

    MDRRRR

    Désolé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. "BandObjectLib.dll" comment sa marche ? ? ?
    Par Silvers dans le forum Windows Forms
    Réponses: 0
    Dernier message: 09/01/2009, 09h57
  2. [Asp et dll] Comment faire
    Par tommey dans le forum ASP
    Réponses: 1
    Dernier message: 20/11/2006, 23h31
  3. Debugger avec VC++ 5 une DLL. Comment faire ?
    Par Pierre8r dans le forum MFC
    Réponses: 2
    Dernier message: 11/02/2005, 09h32
  4. [RegEx] preg_match_all et retour chariot ??? comment faire ?
    Par zax-tfh dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2004, 17h21
  5. Comment faire un retour a la ligne dans un tableaux Word
    Par alexmorel dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 17/06/2004, 09h31

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