[VB] Panique à bords : Ca marche dans VB, mais pas une fois compilé !

Panique à bords : Ca marche dans VB, mais pas une fois compilé ! [VB] - VB/VBA/VBS - Programmation

Marsh Posté le 05-05-2004 à 09:43:51    

Pendant que je postais mon problème, je pense avoir trouvé la source de l'erreur :bounce:  
 
MAIS ! Je ne sais pas comment le corriger :cry:
 
Un peu de code vaut mieu qu'un long discourt, donc trois fonctions et un type utilisateur :
 

Code :
  1. Private Type dwl
  2.     fileType As String
  3.     fileContent As String
  4. End Type
  5. Private Function downLoadFile(url As String, lfileType As String) As dwl
  6.     Dim objRegExp As RegExp
  7.     Dim objMatch As Match
  8.     Dim colMatches As MatchCollection
  9.     Dim tmpStr As String
  10.     Dim tmpFile As dwl
  11.     ' [...]
  12.    
  13.     If objRegExp.Test(url) Then
  14.        
  15.         ' Création d'un fichier temporaire qui sert au download
  16.         iTmpFile = FreeFile
  17.         Open App.Path & "\" & Replace(cacheFile, "#", iTmpFile) For Binary Access Write As #iTmpFile
  18.         ' [...]
  19.        
  20.         ' Objet WinSock
  21.         With wscHttp
  22.             .Close
  23.             .LocalPort = 0
  24.             .Connect m_strRemoteHost, m_strRemotePort
  25.             Do While .State < 8
  26.                 DoEvents
  27.             Loop
  28.             If .State = 9 Then
  29.                 MsgBox ("Error: Disconnected from server." )
  30.                 On Error Resume Next
  31.                 Close #iTmpFile
  32.                 Kill Replace(cacheFile, "#", iTmpFile)
  33.                 On Error GoTo 0
  34.             Else
  35.                 Close #iTmpFile
  36.                 Open App.Path & "\" & Replace(cacheFile, "#", iTmpFile) For Binary Access Read As #iTmpFile
  37.                 ' Recherche de deux sauts de ligne dans le fichier, afin de sauter l'en-tête HTTP
  38.                 Dim c1 As Byte
  39.                 Dim c2 As Byte
  40.                 Dim c3 As Byte
  41.                 Dim c4 As Byte
  42.                 Dim countChar As Integer
  43.                
  44.                 Do While Not (c1 = 13 And c2 = 10 And c3 = 13 And c4 = 10)
  45.                     c1 = c2
  46.                     c2 = c3
  47.                     c3 = c4
  48.                     Get #iTmpFile, , c4
  49.                     countChar = countChar + 1
  50.                 Loop
  51.                
  52.                 ' Chargement du fichier temporaire dans une chaîne de caractère
  53.                 tmpStr = String(FileLen(App.Path & "\" & Replace(cacheFile, "#", iTmpFile)) - (countChar), " " )
  54.                 Get #iTmpFile, , tmpStr
  55.                 On Error Resume Next
  56.                 Close #iTmpFile
  57.                 Kill Replace(cacheFile, "#", iTmpFile)
  58.                 On Error GoTo 0
  59.             End If
  60.         End With
  61.     Else
  62.         ' [...]
  63.     End If
  64.    
  65.     ' Initialisation de la valeur de retour
  66.     tmpFile.fileType = lfileType
  67.     tmpFile.fileContent = tmpStr
  68.     downLoadFile = tmpFile
  69.    
  70.     Exit Function
  71. ERR_HANDLER_DWL:
  72.     downLoadFile = tmpFile
  73. End Function
  74. Sub saveFile(content As String, fileName As String, filePath As String)
  75.     Dim intFile As Integer
  76.     If LCase(Left(fileName, 7)) <> "mailto:" Then
  77.         intFile = FreeFile
  78.         Open filePath & fileName For Binary Access Write As #intFile
  79.         Put #intFile, , content
  80.         Close #intFile
  81.     End If
  82. End Sub
  83. ' Téléchargement d'un fichier situé derrière un lien de type <a href="(url)">...</a>"
  84. Function getLinks(ByRef document As String)
  85.     Dim objRegExp As RegExp
  86.     Dim objMatch As Match
  87.     Dim colMatches As MatchCollection
  88.     Dim myDoc As String
  89.     Dim myDoc2 As String
  90.     Dim linkFileName As String
  91.     Dim j As Integer
  92.     Dim dwlLnk As dwl
  93.    
  94.     ProgressBar2.Value = 3
  95.     Label6.Caption = "Documents"
  96.    
  97.     myDoc = document
  98.     myDoc2 = document
  99.     Set objRegExp = New RegExp
  100.     objRegExp.Pattern = "(<a[^>]*?href=['|""])([^'|^""]+?)(['|""].*?> )"
  101.     objRegExp.IgnoreCase = True
  102.     objRegExp.Global = True
  103.     If (objRegExp.Test(myDoc2)) Then
  104.         Set colMatches = objRegExp.Execute(myDoc2)
  105.         j = 0
  106.         ProgressBar3.Max = colMatches.Count
  107.         For Each objMatch In colMatches
  108.             linkFileName = Right(objRegExp.Replace(objMatch.Value, "$2" ), Len(objRegExp.Replace(objMatch.Value, "$2" )) - InStrRev(Replace(objRegExp.Replace(objMatch.Value, "$2" ), "\", "/" ), "/" ))
  109.             j = j + 1
  110.             ProgressBar3.Value = j
  111.             Label7.Caption = linkFileName
  112.             frmMain.Refresh
  113.             ' C'est là que ça merde !
  114.             myDoc = Replace(myDoc, objMatch.Value, objRegExp.Replace(objMatch.Value, "$1" & currentDoc & "\" & linkFileName & "$3" ), 1, 1)
  115.             dwlLnk = downLoadFile(objRegExp.Replace(objMatch.Value, "$2" ), "link" )
  116.             saveFile dwlLnk.fileContent, linkFileName, App.Path & docPath & "\" & currentDoc & "\"
  117.         Next
  118.     End If
  119.     getLinks = myDoc
  120. End Function


 
Ce qu'il se passe, c'est que lors du téléchargement des documents d'une page, les fichiers téléchargés font la taille maximale parmis les derniers fichiers téléchargés au sein du document.
En gros, la valeur de "dwlLnk" dans la boucle de la fonction "getLinks" n'est pas correctement écrasée. Et là, je ne vois pas du tout comment forcer VB à la réinitialiser :sweat:
Elle est du type utilisateur mis au début du code.
Le problème peut venir aussi de "saveFile" qui enregistre alors la chaîne dans le fichier destination, mais j'en doute.
 
Le problème, c'est que je ne suis sûr de rien : depuis l'IDE VB, ça marche très bien, je n'ai aucun problème ! Par contre, ça se met à déconner dès que je compile (même sur la même machine)
 
A vrai dire, je pense même que c'est plutôt la fonction "downloadFile" qui déconne, car j'ai le problème aussi à un autre endroit, du programme (par contre, ce second endroit ne pète pas sur tous les PC, sur le mien ça marche, et sur le PC d'un collègue ça déconne :??:)

Reply

Marsh Posté le 05-05-2004 à 09:43:51   

Reply

Marsh Posté le 05-05-2004 à 09:48:15    

Je crois que j'ai trouvé :bounce:
 
(enfin, je suis sûre de rien, depuis 2 jours, ça fait 5 fois que je réécris complètement la partie de téléchargement... :sweat:)
 
J'ai ajouté dans le fonction "downloadFile", au tout début "tmpFile.fileContent = vbNullString"
 
Ca a l'air de forcer la bastiolle à redimensionner la chaîne et donc détruire ce qu'il avait en mémoire...
 
Seulement, avec un "Dim" sur la variable à la ligne précédent, j'aimerais comprendre pourquoi il gardait l'ancienne valeur en mémoire :pt1cable:

Reply

Marsh Posté le 05-05-2004 à 10:09:08    

lol
 
Bon, même avec la modification, ça pétait quand même à d'autres endroits (qui pourtant passent par la même fonction), du coup j'ai foutu des vbNullString un peu partout avant les appels à downloadFile histoire d'initialiser la variable avant son affectation, et ça à l'air de marcher...
 
La bidouille, y'a que ça de vrai avec VB :sweat:
 
 
-- Edit :  
Trop fort :cry: Je relance le programme (qui a marché le fois d'avant) et il re-déconne :cry:
 
Maman, je veux rentrer chez moi faire dodo :cry:


Message édité par Arjuna le 05-05-2004 à 10:10:24
Reply

Marsh Posté le 05-05-2004 à 10:47:13    

Bon, maintenant il plante (boum :D) une fois sur 3 ou 4... Quand on insiste (sans rien toucher) il finit par pas plus merder... Je cherche plus à comprendre... Ca semble venir de WinSock qui se décharge/charge mal en mémoire... C'est mieu qu'à début, fallait que je reboote le PC à chaque fois que je voulais lancer le programme :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed