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

Composants VCL Delphi Discussion :

ZipMaster : Inclure la DLL DelZip179.dll en tant que ressource de l'application


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut ZipMaster : Inclure la DLL DelZip179.dll en tant que ressource de l'application
    Bonjour à tous,

    Je suis en train de découvrir le composant ZipMaster pour créer et ouvrir des archives Zip.
    Son utilisation est assez simple et comme il est libre et gratuit je pense que je vais l'adopter.

    J'ai cependant un petit problème. Il nécessite l'utilisation de la DLL DelZip179.dll.
    Lorsque je fais un programme, j'aime bien tout avoir dans l'exe, quitte l'alourdir un peu.
    Mais je n'arrive pas à intégrer cette DLL en tant que ressource de mon appli.
    J'ai bien vu le programme ZipResMaker.exe chargé de créer cette ressource mais il plante à chaque fois que je clic sur BuildRes.

    Quelqu'un connait-il ZipResMaker.exe ?
    Au pire, y'a t'il une méthode manuelle du style
    Créer un fichier RC avec la DLL, puis charger la DLL au lancement de l'application ? J'ai essayé tout seul mais sans succès.

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    moi je fait comme sa:

    DelZip179.rc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DelZip179 RCDATA "DLL\DelZip179.dll"
    Utils.pas:
    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
    Unit Utils;
     
    Interface
     
    Uses
      Windows, Messages, SysUtils, Classes, ZipMstr, Dialogs, Forms;
     
    Const
      // constante utilisée pour savoir comment est la DDL Zip
      DLLZIP_ALREADYLOADED = 0;
      DLLZIP_ERREXTRACT    = 1;
      DLLZIP_LOADNOW       = 2;
      DLLZIP_UNLOADNOW     = 3;
     
    Function LoadDllZipNow(Var ZipMaster: TZipmaster; Load: Boolean = True): Integer;
     
    Implementation
     
    Function ExtractOfRes(ResName, FileName: String): Boolean;
    Var
      ResourceStream: TResourceStream;
      FichierStream:  TFileStream;
    Begin
      Result := False;
      If FileExists(FileName) Then // on vérifie que le fichier à extraire n'existe pas déjà
        DeleteFile(FileName); // sinon on le supprime
      If Not FileExists(FileName) Then // si le fichier n'existe pas alors on l'extrait
      Begin
        ResourceStream := TResourceStream.Create(hInstance, ResName, RT_RCDATA); // création d'un flux mémoire donnant accès à la ressource compilé
        Try
          FichierStream := TFileStream.Create(FileName, fmCreate); // FileStream permet aux applications de lire et écrire dans un fichier disque.
          Try
            FichierStream.CopyFrom(ResourceStream, 0); // copie du flux donnant accès aux ressources vers le flux fichier
            If FileExists(FileName) Then
              Result := True
            Else
              Result := False;
          Finally
            FichierStream.Free; //libération mémoire du stream fichier
          End;
        Finally
          ResourceStream.Free; //libération mémoire du flux mémoire
        End;
      End;
    End;
     
    {$R DelZip179.RES} //ceci permet d'inclure la DLL DelZip179.DLL
     
    // permet de vérifier s'il y a besoin ou non de charger la DLL ZIP
    Function LoadDllZipNow(Var ZipMaster: TZipmaster; Load: Boolean = True): Integer;
    Var
      DllZipMasterName: String;
    Begin
      DllZipMasterName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'DelZip179.dll'; // on récupère le chemin temporaire et on ajoute le nom de la DLL ZIP
      If Load Then // l'utilisateur veut l'utiliser on vérifie qu'elle est chargée sinon ont la charge
      Begin
        If FileExists(DllZipMasterName) And ZipMaster.DLL_Load Then // on vérifie que le fichier existe et qu'elle est déjà chargée
          Result := DLLZIP_ALREADYLOADED // on renvoie comme réponse quel est déjà chargé
        Else
        If Not FileExists(DllZipMasterName) And Not ExtractOfRes('DelZip179', DllZipMasterName) Then // si le fichier existe pas on essaye de l'extraire
          Result := DLLZIP_ERREXTRACT // on renvoie comme réponse impossible de l'extraire
        Else
        Begin
          ZipMaster.DLLDirectory := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)); // le fichier existe et elle n'est pas chargée alors on effectue le chargement
          ZipMaster.DLL_Load     := True;
          Result                 := DLLZIP_LOADNOW; //on renvoie comme réponse que l'on vient de charger la DLL
        End;
      End
      // utilisateur veut la décharger alors on vérifie qu'elle est chargé
      Else
      If ZipMaster.Dll_Load Then
      Begin
        ZipMaster.Dll_Load := False;  // la DLL est chargé ont la décharge
        DeleteFile(DllZipMasterName); // puis on efface le fichier
        Result := DLLZIP_UNLOADNOW;   // on renvoie comme réponse que la dll a été déchargé
      End
      Else
        Result := -1; // erreur l'utilisateur veut la décharger mais elle n'est pas chargée on renvoie -1
    End;
     
    End.
    Form1:
    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
    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      //on vérifie que la dll zip est chargé sinon on essaye de la charger
      //si le chargement échoue on avertit l'utilisateur et on arrête
      If LoadDllZipNow(ZipMaster1) = DLLZIP_ERREXTRACT Then
      Begin
        Application.MessageBox(PChar(MsgErrZipExtract),
          PChar(MSGError),
          MB_OK Or MB_ICONERROR);
        Exit;
      End;
      //extract, add, etc
    End;
     
    Procedure TForm1.FormClose(Sender: TObject; Var Action: TCloseAction);
    Begin
      //on vérifie si la dll zip est chargé et si oui on la décharge et on l'efface
      LoadDllZipNow(ZipMaster1, False);
    End;
    on peut l'utiliser directement depuis les ressources sans extraction mais j'ai jamais essayé.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Ouiouioui merci pour ta réponse.

    Elle a surtout le mérite de fonctionner parfaitement.
    J'étais déjà parti sur une "intégration manuelle" même si je ne comprend pas pourquoi je n'arrive pas à faire fonctionner ZipResMaker.exe...
    Encore une fois contourne le problème plutôt que je ne le résous !

    Je m'agaçais sur mon code (le même esprit que toi mais en moins bien finit) et je me suis aperçu en regardant ton exemple que j'avais placé le paramètre RT_RCDATA entre simple quote.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Res:= TResourceStream.Create(0, 'DelZip179', 'RT_RCDATA');
    C'est assez amusant car le programme compile et à l'exécution il me renvoyait le message suivant :
    Le projet SupervisionWin32.exe a déclenché la classe d'exception EResNotFound avec le message 'Ressource DelZip179 non trouvée'.
    Du coup je me suis focalisé sur ma ressource que je croyais pas intégré au programme et pas sur ma fonction d'appel.

    Merci à toi

    Une petite remarque sur ta fonction "ExtractOfRes".
    Je pense que tu peux la simplifier en supprimant la variable locale FichierStream qui ne sert à rien puisque la classe TRessourceStream dispose déjà d'une méthode pour écrire sur disque (SaveToFile)

    Proposition:

    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
    Function ExtractOfRes(ResName, FileName: String): Boolean;
    Var
      ResourceStream: TResourceStream;
    
    Begin
      Result := False;
      If FileExists(FileName) Then // on vérifie que le fichier à extraire n'existe pas déjà
        DeleteFile(FileName); // sinon on le supprime
      If Not FileExists(FileName) Then // si le fichier n'existe pas alors on l'extrait
      Begin
        ResourceStream := TResourceStream.Create(hInstance, ResName, RT_RCDATA); // création d'un flux mémoire donnant accès à la ressource compilé
        Try
          FichierStream := TFileStream.Create(FileName, fmCreate); // FileStream 
          FichierStream.SaveToFile(FileName);
          If FileExists(FileName) Then
              Result := True
            Else
              Result := False;
        Finally
          ResourceStream.Free; //libération mémoire du flux mémoire
        End;
      End;
    End;
    Voila, chez moi cela fonctionne.

    Encore merci à toi.

    Je laisse ce post ouvert quelque temps pour voir si quelqu'un connait l'utilisation de ZipResMaker.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Oups j'ai été trop vite dans mon exemple je le redonne :

    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
     
    function SaveResToFile(ResName, FileName: String): Boolean;
    var
      ResourceStream: TResourceStream;
     
    begin
    Result := False;
    if FileExists(FileName) then // on vérifie que le fichier à extraire n'existe pas déjà
      DeleteFile(FileName); // sinon on le supprime
    if not FileExists(FileName) then // si le fichier n'existe pas alors on l'extrait
      begin
      ResourceStream:= TResourceStream.Create(hInstance, ResName, RT_RCDATA); // création d'un flux mémoire donnant accès à la ressource compilé
      try
        ResourceStream.SaveToFile(FileName);
        if FileExists(FileName) then
          Result:= True
        else
          Result:= False;
      finally
        ResourceStream.Free; // Libération mémoire du flux mémoire
        end;
      end;
    end;

  5. #5
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    merci . Si tu réussi à utiliser ZipMaster directement sans DLL je suis intéressé

    edit:
    bon j'ai testé ZipResMaker c'est super simple

    tu le lance, dans "root" tu met le chemin de base de zipmaster ex pour moi c'est:
    C:\Program Files\CodeGear\RAD Studio\5.0\source\ZipMaster\
    les autres chemin faut pas toucher normalement
    dans "language" j'ai coché "french" uniquement
    aprèsclique sur "build res" un res se crée.
    tu ferme.

    dans ton application tu ajoute
    dans le compo ZipMaster1.Language tu met 1036 pour le passer en FR

    Avant de l'utiliser tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ZipMaster1.Dll_Load := True;
    Avant fermeture de l'application ou quand tu n'en a plus besoin tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ZipMaster1.Dll_Load := False;
    J'aurai du tester avant

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    ouiouioui,

    Merci d'avoir essayé et réussi d'utiliser ZipMaster.

    Moi j'ai fait la même chose que toi sauf que mon répertoire root est différent du tien

    C:\Program Files\ZipMaster
    mais ZipResMaker.exe se plante au bout de quelques secondes après appui sur le bouton Build Res.

    L'application est gelée et je dois la tuer brutalement pour sortir.
    Cela doit peut être venir de ma config !!!

    Tant pis, avec ton aide j'ai pu faire ma ressource manuellement.

  7. #7
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    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
    unit ZipMaster;
     
    interface
     
    uses Windows, SysUtils, Classes;
     
    { interface for ZIpMaster }
     
    var
      LibLoaded : boolean = false;
     
    implementation
     
    { implementation for ZipMaster }
     
    var
      ResName : string = 'ZIPMASTER';
      FileName : string = 'ZipMstLib.dll';
     
    initialization
      FileName := ExtractFilePath(ParamStr(0))+FileName;
     
      if FileExists(FileName) then
        DeleteFile(FileName);
     
      with TResourceStream.Create(0, ResName, RT_RCDATA) do
      try
        SaveToFile(FileName);
        LibLoaded := FileExists(FileName);
      finally
        Free;
      end;
     
    finalization
      if FileExists(FileName) then
        DeleteFile(FileName);
     
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/01/2008, 17h47
  2. Charger un fichier en tant que ressource
    Par delph1983 dans le forum Entrée/Sortie
    Réponses: 20
    Dernier message: 05/05/2006, 15h39
  3. [C#] Images PNG en tant que ressources
    Par GoldenEye dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/01/2006, 09h50
  4. image en tant que ressource ..
    Par ilimo dans le forum Windows
    Réponses: 4
    Dernier message: 03/06/2004, 16h35
  5. Licence MySql en tant que BD dans une application web
    Par Volta dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 26/02/2004, 14h38

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