VBA - Type de données Long et UNRAR.DLL

demonleon Messages postés 7 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 26 juillet 2005 - 25 juil. 2005 à 09:51
demonleon Messages postés 7 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 26 juillet 2005 - 26 juil. 2005 à 23:21
J'ai un petit problème avec un de mes programmes. J'ai construit
un programme sous VBA (Excel) qui me permet de lister des
fichiers. Le programme possède une fonction spéciale quand un des
fichiers rencontré est une archive RAR. Il doit me donner la
grosseur non-compressé de l'archive au complet.



Jusque là ça va bien, ça fonctionne, sauf que récemment, je me suis
aperçu d'un problème... En effet, le type LONG ne supporte pas
les chiffres plus grand que 2,147,483,647. Et j'ai quelques
archives dont le contenu décompressé dépasse ce chiffre en nombre de
bytes. Résultat : ça me donne des nombres incroyables (dans le
genre -1549382734).



Après avoir essayé toutes sortes de manipulations (j'ai meme essayé de
déclarer certaines variables en type CURRENCY et ça marche pas) je fais
appel à votre aide.



Voici quelques une des déclarations de mon code pour comprendre :



Private Type RARHeaderData

ArcName As String * 260

filename As String * 260

flags As Long

PackSize As Long <----- c'est ici que ça va pas que crois

UnpSize As Long <----- ainsi que ici !

HostOS As Long

filecrc As Long

FileTime As Long

UnpVer As Long

method As Long

FileAttr As Long

CmtBuf As String

CmtBufSize As Long

CmtSize As Long

CmtState As Long

End Type



Public Declare Function RARReadHdr Lib "unrar.dll" Alias
"RARReadHeader" (ByVal HandleToArcRecord As Long, ByRef ArcHeaderRead
As RARHeaderData) As Long



Dim uHeader As RARHeaderData



Alors si la taille d'un fichier est inférieur au maximum du type LONG, ça va bien...

Si elle dépasse le maximum, pas besoin de dessin, ça donne n'importe quoi.



Vous avez une idée ? Est-ce que le problème viendrais de UNRAR.DLL ?

J'ai lu tous les examples et le type pour Packsize et Unpsize est toujous le meme (LONG)

6 réponses

Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
25 juil. 2005 à 10:43
Salut,

Tu peux essayer avec le type Single si ce n'est déjà fait, ou avec Double mais j'y crois pas ....

Sinon essais de trouver une autre DLL

++

Zlub
0
demonleon Messages postés 7 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 26 juillet 2005
26 juil. 2005 à 00:04
j'ai essayé Single et non ... ça me donne des résultats incroyables ...



et changer de dll ... Unrar.dll, y'en a qu'une ... y'en a pas des tonnes ...



enfin ... je vais voir pour le passage des parametres... ptet qu'il y a kkchose à faire...
0
demonleon Messages postés 7 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 26 juillet 2005
26 juil. 2005 à 00:08
mais ce qui est drole dans tout ça c'est que ça fonctionne bien... tant
que la taille totale des fichiers compressés ne dépasse pas les 2GB ...
0
Zlub Messages postés 809 Date d'inscription mercredi 11 octobre 2000 Statut Membre Dernière intervention 29 septembre 2010 9
26 juil. 2005 à 02:51
Salut,


vi j'ai vu que y'en a pas des tonnes comme tu dis ....

++

Zlub
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
demonleon Messages postés 7 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 26 juillet 2005
26 juil. 2005 à 08:22
Toujours rien ...



j'en suis en ce moment à me demander si je pourrais pas me dépanner
grace aux pointeurs ... copymemory, varptr ... mais vu que c'est pas
documenté ces choses-la, c'est pas évident ... vous avez une idée ?
0
demonleon Messages postés 7 Date d'inscription mardi 12 juillet 2005 Statut Membre Dernière intervention 26 juillet 2005
26 juil. 2005 à 23:21
Bon j'ai avancé un peu ... j'ai réussi à repousser la limite jusqu'à 4GB grace à une conversion signé-non signé



Dim DblSize as Double



If uHeader.UnpSize < 0 Then

DblSize = uHeader.UnpSize + 4294967296#

Else

DblSize = uHeader.UnpSize

End If



Et j'affiche DblSize au lieu de uHeader.UnpSize.



Aussi simple que ça :). Mon problème est toujours la, mais au moins la limite est repoussé à 4294967295 (232) octets (au lieu de 2147483647 (231) octets).



Je me demande s'il serait possible d'utiliser copymemory pour transféré
le contenu de UnpSize. En effet, le paramètre est passé par
référence dans une variable de type long. J'ai essayé avec ma
petite modification pour les tailles plus grandes que 232 et
non ça fonctionne pas ... donc je me disais qu'en copiant carrément la
référence dans une autre variable, elle aussi en référence, mais de
type Double, ça marcherait, mais VBA plante (probablement causé par un
overflow).



Tout commentaires/aide bienvenue
0