begin process at 2008 07 04 00:56:09
1 204 456 membres
3 nouveaux aujourd'hui
14 114 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMPRESSION PAR DLL


Information sur la source

Catégorie :Compression & Split Classé sous : compression, dll Niveau : Débutant Date de création : 02/09/2006 Date de mise à jour : 04/09/2006 18:21:07 Vu / téléchargé: 6 081 / 682

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (25)
Ajouter un commentaire et/ou une note


Description

DLL pour ajouter aisément la compression dans vos progs.
Cette DLL est API (vraie DLL), rien à enregister en base de registres.

Voir implémentation ici:
ZLIB REVUE EN PUR WIN32 ET SANS CRT
http://www.cppfrance.com/code.aspx?ID=39145


UTILISATION DEPUIS VB (et autres):
Option Explicit

Declare Function bnZipFile Lib "bnzlib.dll" (ByVal sSrc As String, ByVal sDst As String) As Long
Declare Function bnUnzipFile Lib "bnzlib.dll" (ByVal sSrc As String, ByVal sDst As String) As Long
Declare Function bnZipFileSec Lib "bnzlib.dll" (ByVal sSrc As String, ByVal sDst As String, ByVal passNbr As Long) As Long
Declare Function bnUnzipFileSec Lib "bnzlib.dll" (ByVal sSrc As String, ByVal sDst As String, ByVal passNbr As Long) As Long
Declare Function bnUnzipFileSecMin Lib "bnzlib.dll" (ByVal sSrc As String, ByVal sDst As String, ByVal passNbr As Long) As Long

ATTENTION:
- Ce qui est compresé par bnZipFileSec() doit être décompressé avec bnUnzipFileSec() ou bnUnzipFileSecMin().
- Toute tentative de décompression par bnUnzipFileSec() verra le prog appelant démappé de la mémoire si le passNbr est faux.
- bnUnzipFileSecMin() ne décharge pas l'appelant mais retourne BNERR_SYST si le passNbr est faux.

' Retours possibles des 2 fonctions:
'   BNERR_OK = 0 QUI EST REUSSITE
'   BNERR_STREAMEND = 1
'   BNERR_NEEDDICT = 2
'   BNERR_FILE = 3
'   BNERR_SYST = 4
'   BNERR_STREAM = -2
'   BNERR_DATA = -3
'   BNERR_MEM = -4
'   BNERR_BUF = -5

Sub TestCmprss()
  Dim r As Long
  r = bnZipFile("D:\BruNews\Scrab.mdb", "D:\Scrab.bnz")
  MsgBox r
End Sub

Sub TestUncmprss()
  Dim r As Long
  r = bnUnzipFile("D:\Scrab.bnz", "D:\Scrab.mdb")
  MsgBox r
End Sub

' -- COMPRESSION AVEC PASSWORD 32 BITS ---

Sub TestCmprssSecu()
  Dim r As Long
  r = bnZipFileSec("D:\BruNews\Scrab.mdb", "D:\Scrab.bnz", 18987)
  MsgBox r
End Sub

' ATTENTION SI bnz EST FAIT PAR bnZipFile()
'   OU bnZipFileSec() AVEC passNbr DIFFERENT
' RETOURNE BNERR_SYST
Sub TestUncmprssSecuMin()
  Dim r As Long
  r = bnUnzipFileSecMin("D:\Scrab.bnz", "D:\Scrab.mdb", 18987)
  MsgBox r
End Sub

' ATTENTION SI bnz EST FAIT PAR bnZipFile()
'   OU bnZipFileSec() AVEC passNbr DIFFERENT
' FERMETURE IMMEDIATE DE CE PROG A PREVOIR
Sub TestUncmprssSecu()
  Dim r As Long
  r = bnUnzipFileSec("D:\Scrab.bnz", "D:\Scrab.mdb", 18987)
  MsgBox r
End Sub
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • bnzlib.dllTélécharger ce fichier [Réservé aux membres club]27 136 octets
  • bnzlib.txtTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 290 octets

Télécharger le zip

04 septembre 2006 16:49:47 :
Versions sécurisées
04 septembre 2006 18:21:07 :
Ajout de bnUnzipFileSecMin().
  • signaler à un administrateur
    Commentaire de jack le 02/09/2006 18:20:31 administrateur CS

    Du VB par BruNews ? ... must see !
    Bien sûr, ça marche impec. Merci
    Il faut quand même rappeler qu'il faut implanter la DLL dans le répertoire %Win%\System32 (ou préciser le chemin dans la déclaration = pas propre et instransportable)
    Comme détaillé dans la source C (lien du commentaire), ce n'est pas une compression compatible ZIP, alors ne venez pas demander.

    Les questions qui viennent ensuite :
    - Comment faire pour insérer plusieurs fichier dans une même archive ?
    - Comment lister le ou les fichiers que renferme une archive ?
    - Comment mémoriser les chemins relatifs ? (et comment les restituer)

    Dans une prochaine version de la DLL ?

  • signaler à un administrateur
    Commentaire de Goel le 02/09/2006 18:21:59

    Et bien je viens de tester. c'est bcp plus rapide que l'ancien.  Félicitation pour ce boulot, car ca marche parfaitement. 10/10!

    En plus très utile!!
    tu viens de rendre un énorme service sur mon projet qui nécéssitait de compresser, decompresser des fichier (pour update).

  • signaler à un administrateur
    Commentaire de jack le 02/09/2006 18:22:55 administrateur CS

    Si tu pouvais détailler ce que signifient les n° d'erreurs retournées par les fonctions ?

  • signaler à un administrateur
    Commentaire de Goel le 02/09/2006 18:23:28

    a vria dire, le DLL est dans le dossier d'execution du programme l'utilisant. Aucun besoin de l'avoir dans le systeme semble t'il.

  • signaler à un administrateur
    Commentaire de BruNews le 02/09/2006 18:46:08 administrateur CS

    BNERR_OK = REUSSITE
    BNERR_FILE = erreur sur ouverture du fichier source ou création du fichier cible.
    BNERR_SYST = erreur lecture ou écriture des fichiers.
    BNERR_MEM = erreur mémoire indisponible.
    BNERR_BUF = erreur interne, buffer de décompression trop petit, me le signaler si (cas improbable) devait arriver, j'augmenterai la taille.
    Les autres cas d'erreurs sont internes aux algos zlib, considérer que les données sont altérées.

    Niet jack, comme précisé sur les sources C, hors de question de refaire un concurrent winzip, ce n'est pas le but.
    Si qlq'un a besoin d'une version personnalisée de la DLL afin que les données ne soient pas déchiffrables par un autre soft, me le demander et sera fait selon disponibilité.

  • signaler à un administrateur
    Commentaire de BruNews le 02/09/2006 18:49:38 administrateur CS

    PRECISION:
    Placer un appel SetCurrentDirectory(app.path) au tout début du prog assure que la DLL est trouvée dans le dossier de l'exe, ça permet de distribuer des progs avec différentes versions de la DLL.

  • signaler à un administrateur
    Commentaire de EBArtSoft le 02/09/2006 18:57:17 administrateur CS

    Jack> Correction, ce n'est pas du VB !
    BruNews> Sans vouloir t'offensé je me demande même ce que ça vient faire ici :

    - Ce n'est pas du VB.
    - Il n'y a pas de code source.
    - Il n'y a pas projet d'exemple mais seulement une dll.

    Bref j'en connais deux/trois qui aurait deja viré le post depuis longtemps. Autant utilisé Zlib qui est libre de droit completement compatible avec vb dont les sources sont diponible avec des projet demo. Cela n'enleve pas l'excelence de ton travail mais cela n'est pas correct vis a vis des autres usager de CS a qui l'on reproche ce genre de pratique.

    @+

  • signaler à un administrateur
    Commentaire de BruNews le 02/09/2006 19:11:07 administrateur CS

    Avec les 2 'Declare', il y a 12 lignes en VB.
    C'est donc une source exemple avec un code libre de droit et d'utilisation dont les sources sont fournies en lien dans la partie 'description'.

  • signaler à un administrateur
    Commentaire de eldim le 04/09/2006 09:54:16

    Bonjour,

    j'ai pas encore testé mais jusqu'à combien de Go elle peut compresser par fichier et en tout ?

  • signaler à un administrateur
    Commentaire de BruNews le 04/09/2006 10:52:06 administrateur CS

    Si l'alloc mémoire réussit au début (non dépendant de taille fichier), aucune limite (64 bits full).

  • signaler à un administrateur
    Commentaire de asimengo le 04/09/2006 11:58:50

    @Brunews : y'a t-il une possibilité de compresser/décompresser avec option password sur ta DLL?

  • signaler à un administrateur
    Commentaire de BruNews le 04/09/2006 12:25:38 administrateur CS

    Aucun password dans cette version standard.

    Irait ainsi:
    Declare Function bnZipFileSecure Lib "bnzlib.dll" (ByVal sSrc As String, ByVal sDst As String, ByVal passNbr As Long) As Long
    Declare Function bnUnzipFileSecure Lib "bnzlib.dll" (ByVal sSrc As String, ByVal sDst As String, ByVal passNbr As Long) As Long
    je RAJOUTE ces 2 fonctions avec un param 32 bits, si bnUnzipFileSecure() appelé et que passNbr ne correspond pas, au choix je retourne BNERR_DATA (histoire de ne pas indiquer quelle erreur) ou alors je démappe direct le processus appelant de la mémoire (éviter piratage par tentative en boucle).

  • signaler à un administrateur
    Commentaire de asimengo le 04/09/2006 14:22:55

    @Brunews : comment faire pour avoir la version qui intègre bnZipFileSecure et bnUnzipFileSecure. Une mise à jour est-elle avenir? ou alors http://www.cppfrance.com/code.aspx?ID=39145 ferait l'affaire.

    Comme tu le disais avec un appel SetCurrentDirectory(app.path) au début pas besoin de ...
    Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long

  • signaler à un administrateur
    Commentaire de BruNews le 04/09/2006 14:53:56 administrateur CS

    MAJ de la source pour ce soir si tout va bon.

  • signaler à un administrateur
    Commentaire de BruNews le 04/09/2006 16:51:37 administrateur CS

    MAJ disponible.

  • signaler à un administrateur
    Commentaire de asimengo le 04/09/2006 17:57:45

    Merci Brunews, super nickel.

    juste un point sur ce commentaire
    ' ATTENTION SI bnz EST FAIT PAR bnZipFile()
    '   OU bnZipFileSec() AVEC passNbr DIFFERENT
    ' FERMETURE IMMEDIATE DE CE PROG A PREVOIR
    Je constate également que si le fichier n'est pas un vrai fichier *.bnz le programme se ferme.
    Comment prévoir/empêcher ce plantage?
    ça ressemble à vouloir le pain chargé + argent du chargement.

    Mais en réalité ça peut devenir un grand problème si cette option est intégrée à un programme libre qui doit planter chaque fois que l'utilisateur sélectionne le mauvais fichier ou donne un mauvais password. Même un conseil pour le contrôle du plantage serait toujours super.

  • signaler à un administrateur
    Commentaire de BruNews le 04/09/2006 18:09:45 administrateur CS

    A moins de décompiler puis modifier le code binaire de la DLL, rien à intercepter, c'est fermeture (et non plantage).

    J'ajoute bnUnzipFileSecMin() qui sera idem que bnUnzipFileSec() mais retournera BNERR_SYST si pass faux mais sans fermer l'appelant. Sera dernière MAJ.

  • signaler à un administrateur
    Commentaire de BruNews le 04/09/2006 18:21:33 administrateur CS

    C'est fait.

  • signaler à un administrateur
    Commentaire de asimengo le 04/09/2006 19:39:32

    beaucoup beaucoup merci, c génial.

  • signaler à un administrateur
    Commentaire de eldim le 05/09/2006 08:08:09

    Bonjour,

    Après test, cela compress légèrement mieux que C#Zip de sourceforge mais y a-t-il la possibilité possibilité de compresser tout un répertoire ? si oui y a-t-il possibilité de faire de la compression "intelligente" à savoir ne compresser que les fichiers qui ne sont pas déja dans le zip ou qui sont différents de ceux déja présents ?

  • signaler à un administrateur
    Commentaire de BruNews le 05/09/2006 09:34:49 administrateur CS

    Fait pour compresser les fichiers de données de VOS progs, pas prévu pour concurrencer winzip ou winrar.

  • signaler à un administrateur
    Commentaire de eldim le 05/09/2006 10:14:05

    ok pas de polémique mais bon... hem... heureusement qu'y C#lib

  • signaler à un administrateur
    Commentaire de BruNews le 05/09/2006 10:27:02 administrateur CS

    Chaque chose a son emploi, voila tout. Ajouter le multi fichier dans archive ne serait techniquement pas difficile mais c'est long à mettre en place, à moins d'une commande privée, aucune chance que je perde du temps dessus.
    Polémique, sur quoi ???

  • signaler à un administrateur
    Commentaire de Grandnord le 10/10/2006 21:45:17

    Est-ce possible de compresser des répertoires avec les sous-répertoires?

  • signaler à un administrateur
    Commentaire de BruNews le 10/10/2006 21:57:27 administrateur CS

    ah ben non, pas le but du jeu du tout.

    Si tu y tiens, reprends le code (lien en decription de source) et appelle le en récurrence sur FindFirstFile() FindNextFile(). Pas besoin d'être grand clerc mais vraiment pas le temps de le faire.

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS