Newsgroup: it.comp.lang.visual-basic
Titolo: [?] DLL argomenti ByVal e ByRef

scusate se disturbo di nuovo, ma sono rimasto sveglio quasi tutta la notte
per cercare di capire che diavolo č successo.
una volta scaricato unzip32.dll, ho voluto provare la funzione
UnZipFindFirst. ecco la sua sintassi:
int WINAPI UnZipFindFirst(HARC hArc,
   LPCSTR szWildName,LPINDIVIDUALINFO lpSubInfo)
Description
 Returns information on the first matching file found in the
 archive file
Parameter
 hArc  Handle returned by UnZipOpenArchive()
 szWildName File name to find. File name may contain wild
   card character.
   Several file name by be specified by separating
   file name with a space
 lpSubInfo Pointer to INDIVIDUALINFO structure to hold
   information on the file.
   If information is not needed, assign NULL
come al solito, visto che il file di spiegazioni č fatto coi piedi, il tipo
INDIVIDUALINFO non era elencato.
mi sono connesso al sito da cui ho scaricato la DLL, e ne ho trovato una
analoga, che fa le stesse cose, invece che con ZIP, con ARJ (UnArj32 o
qualcosa del genere).
c'erano praticamente le stesse funzioni, con la sintassi anche in visual
basic.
la sintassi per FindFirst era:
(ByVal hArc As Long, ByVal szWildName As String, ByVal lpSubInfo As
INDIVIDUALINFO)
e c'era anche la definizione di INDIVIDUALINFO:
Type INDIVIDUALINFO
    dwOriginalSize As Long
    dwCompressedSize As Long
    dwCRC As Long
    uFlag As Long
    uOSType As Long
    wRatio As Long
    wDate As Long
    wTime As Long
    szFileName As String
    dummy1 As String * 3
    szAttribute As String
    szMode As String * 8
End Type
una pacchia, ho pensato, e invece...
quando eseguo il progetto, in cui alla fine c'č una funziona FindFirst, non
mi ci fa neanche arrivare. si blocca all'inizio e dice (sto con VB5), che i
parametri di tipo definito dall'utente non possono essere passati ByVal.
eppure la sintassi di chi ha creato la DLL dice il contrario... inutile
chiedere chi ha ragione.
insomma, provo a togliere ByVal dalla dichiarazione, ma, sia mettendo che
omettendo ByRef, il progetto funziona finchč non si chiama FindFirst,
dopodichč mi esce la fatidica pagina blu "errore in ...,... premere un tasto
per terminare l'applicazione, o Ctrl+Alt+Canc per chiudere il computer". non
solo, mica si accontenta di chiudere solo VB!! piano čpiano a uno a uno non
funziona piu niente e dvo riavviare ogni volta... TUTTO QUESTO PER AVERE
MESSO BYREF AL POSTO DI BYVAL!!!!!! assurdo... non poteva limitarsi a dire
"chiamata DLL non valida" invece di scatenare un putiferio??
cmq... le cose stanno cosě: se metto byval, mi dice che un tipo definito
dall'utente non puo essere passato per valore, se non ce lo metto, si
blocca... come la risolvo la situazione??
grazie.
Mario

m'e' caduto all'occhio proprio ora quel WINAPI...
questo credo ti complichera' le cose...
da quanto ne so, WINAPI, CALLBACK, PASCAL sono tutte macro per dire la
stessa cosa
- questa funzione non la chiami tu, ma te la lancia il sistema operativo
quando sara' il momento -
se ho visto giusto, questa dichiarazione te la devi scrivere come
dichiarazione di funzione
e da qualche parte dovrai passargli il puntatore di questa funzione...
se non e' troppo complicato,  e se ti va l'idea.. potresti mandarmi il
materiale che hai (se non sono 20MB :)
cosi' provo a vedere se riesco a fare qualcosa (mi acchiappa l'idea di
zippare e unzippare file da codice...se e' questo che stai cercando di fare)
beh, se ti va, grazie 1000
ciao

che si inchiodi, e' per via che a basso livello (ma gia' in C) non ci sono
controlli
se una funzione ti chiede un puntatore e gli passi un'altro numero, quella
non lo sa
gli arrivano 4byte, li interpreta come un puntatore, e va a scrivere chissa
dove in memoria
se scrivi in C, ti trovi assai spesso con errori di protezione generale
non conosco queste funzioni (che mi piacerebbe prima o poi imparare) ma quel
LPINDIVIDUALINFO, e lpSubInfo...
ma soprattuto quel  -lp-  sta a significa long pointer
nella documentazione dicono che puoi dargli null, dovresti provare a
passargli 0&  (zero long)
secondo me cosi' va
se invece vuoi usare quella struttura (INDIVIDUALINFO) credo (ma non sono
sicuro) che il ByRef vada bene, ma che ci siano problemi per come e' stato
definito il typo in VB
ci sono stringhe a lunghezza variabile, non credo questo sia corretto
di piu' non so dirti... bisognerebbe fare delle prove...ciao, e buona
fortuna

 wrote in message
news:8ocang$21q$1...@nslave1.tin.it...


ehm... sinceramente non ho capito granchè di quello che avete scritto... non
so niente di C e Pascal...
in ogni caso (grazie a Zanna e al tizio giapponese che ha creato le DLL in
questione) ho risolto il problema.
non solo. ho scritto un programmino che zippa, unzippa, compatta in arj e
scompatta file arj. e ora mi sfizierò anche con rar e lha... ::))))
in ogni caso, l'argomento lpSubInfo che mi ha fatto penare non poche ore, va
dichiarato ByRef lpSubInfo as INDIVIDUALINFO. non ho ancora provato a
passargli NULL o 0&. è vero che posso passargli anche Null? esiste un Null
in Visual Basic? credo che passandogli Null sia molto piu veloce, perche non
va a scrivere niente in lpSubInfo, del resto findfirst mi serve solo per
"puntare" ad un file di cui poi vado a leggere le informazioni in altro
modo...
cmq grazie a tutti, è davvero prezioso questo NG.
Mario