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é: 7 134 / 738

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

 

Fichier Zip

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

Historique

04 septembre 2006 16:49:47 :
Versions sécurisées
04 septembre 2006 18:21:07 :
Ajout de bnUnzipFileSecMin().

Commentaires et avis

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

Discussions en rapport avec ce code source dans le forum

Compression en vb.NET [ par stranix ] Bonjour à tous,Voici un problème tout simple sur lequel je cale depuis des jours et des jours: comment compresser un fichier en vb.NET ? J'ai bien tro Lz32.dll [ par logik51 ] Salut,Lz32.dll est une Routines de compression 32 bits utilisée par windows....j'aimerai pouvoir compresser des fichiers via une aplli VB grace à cett Compression par Fast Fourrier Transform pour WebPhone.... [ par grosiflex ] Bon, j'ai concu un petit Web Phone tres simpliste, basé sur la dll d'acces au matos sonor de Windows (WinMM.dll) et sur les Winsock standard de VB.je Lancer un executable sans lancer son setup [ par Kepone ] Salut,j'aimerais pouvoir faire fonctionner une de mes applis sans faire une installation préalable. En gros j'aimerais avoir sur un cd l'éxécutable ai Propriétés DLL [ par CBlanchet ] Bonjour,j'ai un programme qui doit vérifier si la DLL s'est bien compilé avant de l'installer.Je sais que je dois utilisé les propriétés "UNATTENDED E Urgent pb d'empaquetage???? [ par sonia2002 ] salut tt le monde,j'ai developpe une application client/serveur avec vb6 et sql serv2000 et crystal report 7.0, lors de l'empaquetage l'aasistant four Perte de mes dernière modif [ par AkaSya ] Bonjour à tous!Ce n'est vraiment pas ma journée! En voulant mettre dans source safe les dernière modif sur une de mes classe, j'ai malheureusement rem urgent : lire une DLL [ par gan ] Est ce quelqun peut me sauver la vie , comment faire pour lire ce qu'il y a dans une DLL???? Où mettre les .dll [ par olicool ] J'ai besoin d'aide. Je ne sais pas où mettre mais .dll et .ocx quand je met des projet dans un autre PC. Ça marche dans le bureau mais c laid pis sa p Vitesse processeur Registre (Appli professionnel) [ par Kepone ] Salut,j'ai un probleme avec une appli qui va me servir dans ma société.Je dois entre autre récupéré la vitesse du processeur de la machine sur laquell


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,388 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.