demonleon
Messages postés7Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention26 juillet 2005
-
25 juil. 2005 à 09:51
demonleon
Messages postés7Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention26 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)
demonleon
Messages postés7Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention26 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 ?
demonleon
Messages postés7Date d'inscriptionmardi 12 juillet 2005StatutMembreDernière intervention26 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).