Newsgroup: it.comp.lang.visual-basic
Titolo: MemCopy - AIUTO

Salve a tutti,
vorrei sapere se è possibile con VB5 copiare zone di memoria.
Mi spiego meglio vorrei trasferire il contenuto di una variabile Type
definita dall'utente in un array di byte opportunamente dimensionato
passando alla Sub che effettua il trasferimento un puntatore alla variabile
Type e il puntatore alla variabile array di byte.
Sono alcuni giorni che analizzo le API e mi sembra che la cosa sia possibile
ma da solo non ci salto fuori. Sul sito comune è presente una DLL (VBASM)
che esegue queste operazione e altro ancora ma purtroppo funziona solamente
a 16bit.
Rispondetemi anche se secondo voi la cosa non è possibile, almeno non perdo
ulteriore tempo.
Grazie.

Hai provato con CopyMemory?
Ciao,
Moreno
#sirri#@
tin.it
(togliete "#" dall'indirizzo)
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.murialdo.it/it_lang_vb
---------------------------------------------------------------------------

 wrote in message
375f8090...@news2.tin.it...



La cosa e' fattibile, l'API giusta che fa per te e' RTLMOVEMEMORY.
Ma andiamo per ordine :
In un modulo generale metti le seguenti dichiarative :
Option Explicit
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal DestVar
As Long, ByVal SourceVar As Any, ByVal ByteToCopy As Long)
'Questo e' un UDT che ho messo per prova.... inserisci il tuo
Type KK_Key
     kk_codsoc As Byte
     kk_coddip As Integer
     kk_data As Date
     kk_ora As Single
End Type
Global Key_Rec As KK_Key
nella tua form, (io ho associato il tutto alla pressione di un Command )
metti questo codice
        Dim byMy_Array() As Byte      ' Il tuo array di byte
        Dim i As Integer
        Dim Str1 As String
        Dim Str2 As String
        Dim ptrStr As Long
        'Valorizzo i vari campi dell'UDT
        Key_Rec.kk_codsoc = 14
        Key_Rec.kk_coddip = 27
        Key_Rec.kk_data = DateAdd("d", 1, Date)
        Key_Rec.kk_ora = Timer
       'Questa serve SOLO come esempio per copiare l'UDT in un unica stringa
        Str2 = Space$(Len(Key_Rec))              'Alloco lo spazio x la
stringa di ritorno   *****vedi nota
        ReDim byMy_Array(Len(Key_Rec))     'Alloco lo spazio x il mio array
*****vedi nota
        CopyMemory StrPtr(Str2), VarPtr(Key_Rec), Len(Key_Rec)
' x copiare un UDT su una stringa
        CopyMemory VarPtr(byMy_Array(0)), VarPtr(Key_Rec), Len(Key_Rec)
' x copiare un UDT su un Array di byte
 end sub
l'unica cosa alla quale devi prestare attenzione e' il fatto che le stringhe
"consumano" un numero di byte in memoria pari al doppio della loro
lunghezza.
Quindi se usi stringhe all'interno del tuo UDT devi fare le tue dovute e
giuste considerazioni sulla lunghezza.
In parole povere dove sopra nel codice vedi LEN(KEY_REC) devi aggiungere
ancora la somma dei byte delle stringhe nel tuo UDT.
Spero di essere stato chiaro e di averti risolto il problema.
Ciao e fammi sapere........

Sintassi:
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(dest As Any, source As Any, ByVal numBytes As Long)
Bye
Roberto

 wrote in message 92908499...@fab-srv.fastnet.it...
Grazie mille a tutti, ho risolto il mio problema e funziona benissimo, anzi
se si utilizza la funzione LenB si ottiene gia' da subito la dimensione
dell'UDT anche se vi sono stringhe al suo interno.
Anche se mi rimangono ancora alcuni dubbi :
le funzioni VarPtr e StrPtr dove sono documentate, niente nei file di help e
nulla anche nei manuali?? Boo.
Inoltre la funzione RtlMoveMemory non è documentata ne in Win32.hlp ne in
Win32sdk.hlp, non sapete percaso dove reperire queste misteriose
informazioni.
In ogni caso ho capito che per ottenere una certa flessibilità con VB è
necessario appoggiarsi alle API, Speriamo che non pungano e che facciano
ottimo miele :))
Grazie ancora.