Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - Problema Visual Basic Errore Memoria Esaurita
Forum - Visual Basic 6 - Problema Visual Basic Errore Memoria Esaurita

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
Nesher (Normal User)
Rookie


Messaggi: 45
Iscritto: 02/09/2009

Segnala al moderatore
Postato alle 9:23
Giovedì, 29/10/2009
Buongiorno a tutti...ho un problema con il vb6...mentre effettuavo delle prove con un programma antimalware(chiamatelo pure antivirus come volete) alla scansione di un file di dimensioni sui 300-400 Mb mi dice Errore '7' Memoria Esaurita.premetto che ho utilizzato un array di tipo byte.Come si potrebbe ovviare ad un problema del genere?so che problemi come questi in vb6 sn frequenti.Vi ringrazio in anticipo!

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 9:28
Giovedì, 29/10/2009
Ecco perche' il VB6 non e' adatto a questo tipo di lavori ...

Non ho visto il tuo codice ma potresti usare delle API di Windows per allocare la memoria ...

Tieni presente che il codice userà tanto le API che sarà meglio riscriverlo in C/C++

PM Quote
Avatar
Nesher (Normal User)
Rookie


Messaggi: 45
Iscritto: 02/09/2009

Segnala al moderatore
Postato alle 9:51
Giovedì, 29/10/2009
Ecco il mio codice!La mia intenzione è creare un tool antimalware per USB...parlando con un mio ex professore che tempo fa ne aveva realizzato uno e che funzionava bene...spero di averti postato codice a sufficenza....se ci riusciamo a risolverlo volevo poi postarlo qui su questa bella comunità di programmatori grazie ragazzi!



'Modulo per generazione Somma di Controllo MD5 da File
'|------------------------------BUG SECTION-----------------------------------|
'Bug Riscontrati: Errore '7' Memoria Esaurita per file di dimensioni > 200 Mb
'Riga di Errore:InputFile = StrConv(uBuffer, vbUnicode)

Option Explicit

Public Const OPEN_EXISTING = 3
Public Const GENERIC_READ = &H80000000
Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const BUFFER_SIZE As Long = 500000

'MD5 Hashing
Public Const MS_ENHANCED_PROV As String = "Microsoft Enhanced Cryptographic Provider v1.0"
Public Const MS_BASE_PROV As String = "Microsoft Base Cryptographic Provider v1.0"
Public Const PROV_RSA_FULL As Long = 1
Public Const ALG_CLASS_DATA_ENCRYPT As Long = 24576
Public Const ALG_TYPE_STREAM As Long = 2048
Public Const ALG_TYPE_ANY As Long = 0
Public Const ALG_SID_RC4 As Long = 1
Public Const ALG_SID_MD5 As Long = 3
Public Const CALG_RC4 As Long = ALG_CLASS_DATA_ENCRYPT Or ALG_TYPE_STREAM Or ALG_SID_RC4
Public Const CRYPT_VERIFYCONTEXT = &HF0000000
Public Const CRYPT_NEWKEYSET As Long = 8
Public Const ENCRYPT_ALGORITHM As Long = CALG_RC4
Public Const ENCRYPT_NUMBERKEY As String = "16006833"
Public Const ALG_CLASS_HASH As Long = 32768
Public Const HP_HASHVAL As Long = 2
Public Const HP_HASHSIZE As Long = 4

Public Const HASH_TYPE = ALG_TYPE_ANY Or ALG_CLASS_HASH Or ALG_SID_MD5

Public Declare Function GetTickCount Lib "kernel32.dll" () As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long

Public Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" (ByRef phProv As Long, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Long, ByVal dwFlags As Long) As Long
Public Declare Function CryptCreateHash Lib "advapi32.dll" (ByVal hProv As Long, ByVal Algid As Long, ByVal hKey As Long, ByVal dwFlags As Long, ByRef phHash As Long) As Long
Public Declare Function CryptHashData Lib "advapi32.dll" (ByVal hHash As Long, ByVal pbData As String, ByVal dwDataLen As Long, ByVal dwFlags As Long) As Long
Public Declare Function CryptDeriveKey Lib "advapi32.dll" (ByVal hProv As Long, ByVal Algid As Long, ByVal hBaseData As Long, ByVal dwFlags As Long, ByRef phKey As Long) As Long
Public Declare Function CryptEncrypt Lib "advapi32.dll" (ByVal hKey As Long, ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbData As String, ByRef pdwDataLen As Long, ByVal dwBufLen As Long) As Long
Public Declare Function CryptDecrypt Lib "advapi32.dll" (ByVal hKey As Long, ByVal hHash As Long, ByVal Final As Long, ByVal dwFlags As Long, ByVal pbData As String, ByRef pdwDataLen As Long) As Long
Public Declare Function CryptGetHashParam Lib "advapi32.dll" (ByVal pCryptHash As Long, ByVal dwParam As Long, ByRef pbData As Any, ByRef pcbData As Long, ByVal dwFlags As Long) As Long
Public Declare Function CryptDestroyKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public Declare Function CryptDestroyHash Lib "advapi32.dll" (ByVal hHash As Long) As Long
Public Declare Function CryptReleaseContext Lib "advapi32.dll" (ByVal hProv As Long, ByVal dwFlags As Long) As Long

'**InputFile$
'*
Public Function InputFile$(ByRef sFile$)
    Dim hFile&, uBuffer() As Byte, lFileSize&, lBytesRead&
    
    hFile = CreateFile(sFile, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0, OPEN_EXISTING, 0, 0)
        
    If hFile = -1 Then
        Exit Function
    End If
    lFileSize = GetFileSize(hFile, 0)
    
    If lFileSize < 1 Then
        CloseHandle hFile
        Exit Function
    End If
    
    ReDim uBuffer(lFileSize - 1)
    
    If ReadFile(hFile, uBuffer(0), lFileSize, lBytesRead, ByVal 0) <> 0 Then
        If lBytesRead <> lFileSize Then
            ReDim Preserve uBuffer(lBytesRead)
        End If
        InputFile = StrConv(uBuffer, vbUnicode)
    End If
    CloseHandle hFile
End Function 'InputFile$

'**GetMD5$
'*
Public Function GetMD5$(ByRef sFileName$)
    GetMD5 = MD5String(InputFile(sFileName))
End Function 'GetMD5$

'**MD5String [Calcolo Somma di Controllo File]
'*
Public Function MD5String(ByRef sString$)
Dim uMD5() As Byte, lMD5Len&, i&, sMD5$, hCrypt&, hHash&
    ReDim uMD5(BUFFER_SIZE)
    If CryptAcquireContext(hCrypt, vbNullString, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) <> 0 Then
        If CryptCreateHash(hCrypt, HASH_TYPE, 0, 0, hHash) <> 0 Then
            If CryptHashData(hHash, sString, Len(sString), 0) <> 0 Then
                If CryptGetHashParam(hHash, HP_HASHSIZE, uMD5(0), UBound(uMD5) + 1, 0) <> 0 Then
                    lMD5Len = uMD5(0)
                    If CryptGetHashParam(hHash, HP_HASHVAL, uMD5(0), UBound(uMD5) + 1, 0) <> 0 Then
                        For i = 0 To lMD5Len - 1
                            sMD5 = sMD5 & (Right$("0" & Hex$(uMD5(i)), 2))
                        Next i
                        MD5String = sMD5
                    End If
                End If
            End If
        End If
    End If
    CryptDestroyHash hHash
    CryptReleaseContext hCrypt, 0
End Function 'MD5String

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:24
Giovedì, 29/10/2009
Ecco ... non e' solo una questione di allocazione dell'array di byte, ma di allocazione di una stringa con

StrConv(uBuffer, vbUnicode)

che ovviamente va oltre le capacità di VB6.

Dovresti provare a modificare il codice in modo da usare SOLO l'array di byte allocato, senza usare stringhe di passaggio.

PM Quote
Avatar
Nesher (Normal User)
Rookie


Messaggi: 45
Iscritto: 02/09/2009

Segnala al moderatore
Postato alle 10:32
Giovedì, 29/10/2009
Praticamente mi stai dicendo di fare in questa maniera?

ESEMPIO

InputFile = (uBuffer, vbUnicode)

Oppure mi suggerisci altro?

PM Quote
Avatar
Nesher (Normal User)
Rookie


Messaggi: 45
Iscritto: 02/09/2009

Segnala al moderatore
Postato alle 10:41
Giovedì, 29/10/2009
se..ometto la stringa di conversione...mi cambia anche il codice MD5

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:49
Giovedì, 29/10/2009

Codice sorgente - presumibilmente Plain Text

  1. InputFile = (uBuffer, vbUnicode)



No ... cosi' non ha senso ... Intendevo dire di utilizzare l'array di byte (dichiarandolo globalmente) al posto della stringa ...

PM Quote
Avatar
Nesher (Normal User)
Rookie


Messaggi: 45
Iscritto: 02/09/2009

Segnala al moderatore
Postato alle 10:55
Giovedì, 29/10/2009
Scusa l'insistenza...ma io non ho dichiarato...nessuna variabile la StrConv è la funzione standard...di vb6 l'unica cosa che si può mettere globale è l'array..esatto?

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 18:22
Giovedì, 29/10/2009
Testo quotato

Postato originariamente da Nesher:

Scusa l'insistenza...ma io non ho dichiarato...nessuna variabile la StrConv è la funzione standard...di vb6 l'unica cosa che si può mettere globale è l'array..esatto?



Non ho parlato di "variabile stringa" ma solo di "stringa", quella temporanea creata dalla funzione StrConv e restituita dalla funzione.

Sì, e' l'array di byte che dovrebbe essere globale (cosi' da occupare una sola volta la memoria).

PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo