()
Newbie
Messaggi:
Iscritto:
|
Postato originariamente da swet:
Ragazzi per il momento funziona contando le unità ogni X secondi e confrontarle con quelle che c' erano all' avvio del programma.
Codice sorgente - presumibilmente VB.NET |
If driveiniziali > drivecontrollo Then 'quindi la pennina è stata rimossa Stato.Text = "Inserire la pendrive" Else For Each drive In Directory. GetLogicalDrives Cercaseriale() If Seriale = serialeunità Then Stato. Text = "PENDRIVE RILEVATA " & drive Exit For 'da verificare End If Next End If
|
Come vedete faccio una ricerca della pendrive attraverso il seriale.
Il tutto è eseguito da un timer ogni 1500ms. Vi sembra pesante? |
Pesante? Per nulla... molto più pulito e veloce dell'esempio che ho scritto in precedenza. |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Postato originariamente da NetProgrammer:
Scusate ma perchè usare tutti questi cicli for do..loop ecc.. swet chiede come bloccare il pc alla rimozione di una chiave usb; basta controllare con un if se questa chiavetta intesa come drive è presente o meno e se non lo è blocca il pc. I vantaggi??
1) Niente cicli solo un if,
2) Niente combobox e quant'altro qundi risparmio in termini di spazio su disco e di pesantezza nel caricamento.
3) La possibilità di usare un timer senza appesantire ne il programma ne la memoria. |
Sono d'accordo sulle listbox (totalmente inutili dato che non serve visualizzare nulla), ma non occupano spazio su disco (a meno che non vengano memorizzati nell'area di swap, ma questo avviene solo quando il processo è in pausa): tutti i dati relativi all'esecuzione vanno nella memoria di lavoro.
Inoltre, questo metodo del "guardare quanti ce ne sono" può funzionare in molti casi, ma non in tutti. Se, ad esempio, all'attivazione del programma esiste un dispositivo che viene poi rimosso, ma mentre la pendrive è ancora inserita, avrai che, nonostante l'inserimento della chiave, il programma rileva meno drives di quelli necessari a far partire il controllo. Quindi potresti togliere l'If e lasciare solamente il For, poiché presumiamo che il seriale dell'unità sarà unico indipendentemente dal numero di drives. |
|
swet (Normal User)
Pro
Messaggi: 128
Iscritto: 01/01/2009
|
Usando questo codice:
Codice sorgente - presumibilmente VB.NET |
For Each drive In Directory. GetLogicalDrives Cercaseriale() If Seriale = serialeunità Then Stato. Text = "PENDRIVE RILEVATA " & drive Exit For 'da verificare Else Stato.Text = ("Pendrive non trovata") End If Next
|
ho il problema che ogni 1500ms mi riesegue il ciclo, quindi la stato.text mi cambia sempre. Se la label cambia sempre significa che il pc si blocca e si sblocca ogni 1500ms. L' unica cosa che mi viene in mente è fermare il timer, però poi come faccio a sapere se la pendrive è stata rimossa?
Grazie
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Postato originariamente da swet:
Usando questo codice:
Codice sorgente - presumibilmente VB.NET |
For Each drive In Directory. GetLogicalDrives Cercaseriale() If Seriale = serialeunità Then Stato. Text = "PENDRIVE RILEVATA " & drive Exit For 'da verificare Else Stato.Text = ("Pendrive non trovata") End If Next
|
ho il problema che ogni 1500ms mi riesegue il ciclo, quindi la stato.text mi cambia sempre. Se la label cambia sempre significa che il pc si blocca e si sblocca ogni 1500ms. L' unica cosa che mi viene in mente è fermare il timer, però poi come faccio a sapere se la pendrive è stata rimossa?
Grazie |
Ma, semplicemente, non usare l'If dentro al For. A te serve che almeno uno dei dispositivi sia quello voluto. Perciò bisogna controllari al massimo tutti, ma il testo deve essere modificato una sola volta.
Inoltre, ti suggerisco di rendere CercaSeriale() una funzione: il codice sarà più ordinato e comprensibile. Ad esempio in questo modo:
Codice sorgente - presumibilmente VB.NET |
Dim PenDriveOn As Boolean = False For Each drive In Directory. GetLogicalDrives() If CercaSeriale (drive) = Seriale Then PenDriveOn = True Exit For End If Next If PenDriveOn Then Stato.Text = "PenDrive rilevata" Else Stato.Text = "PenDrive non trovata" End If
|
La label non può cambiare a meno che si rimuova la pendrive. |
|
swet (Normal User)
Pro
Messaggi: 128
Iscritto: 01/01/2009
|
Ciao totem , ho provato a mettere tutto in una funzione , ma purtroppo non riesco a farlo funzionare, cioè mi dice sempre che la pendrive è collegata.Il codice che ho usato è questo sicuramente c'è qualche errore:
Codice sorgente - presumibilmente VB.NET |
Dim Seriale As String Dim serialeunità As String = "977A2C8C" Function Cercaseriale (ByVal drive As String) As String Try Dim HardDiskInfo As New ManagementObject (String. Format("Win32_LogicalDisk.DeviceID=""{0}""", Mid(drive, 1, 2))) Seriale = HardDiskInfo.Properties("Volumeserialnumber").Value.ToString() Catch Stato.Text = "Si è verificato un errore" End Try Return Seriale End Function Private Sub controllo() Dim PenDriveOn As Boolean = False For Each drive In Directory. GetLogicalDrives() If Cercaseriale (drive) = Seriale Then PenDriveOn = True Exit For End If Next If PenDriveOn = True Then Stato.Text = "PenDrive rilevata" Else Stato.Text = "PenDrive non trovata" End If End Sub
|
Puoi aiutarmi?
EDIT: Funziona alla grande! Il problema è che con il tuo codice facevo la verifica del seriale con la variabile seriale invece che con la veriabile serialeunità. Che errore stupido!!!! Grazie mille!!!
Ora ho un altro problema. Il software, adesso funziona(ovviamente) solo il seriale della mia pendrive, se volessi farlo funzionare anche con altri seriali, di altre pendrive? Scrivo i seriali in un file? E se il file venisse cancellato, la protezione andrebbe a farsi benedire giusto? Idee?! Grazie
Ultima modifica effettuata da swet il 04/01/2010 alle 13:47 |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Quello che ti propongo è poco "ortodosso", ma rende il seriale logicamente indistruttibile. Salvare quei dati su un qualsiasi supporto li rende sempre vulnerabili. Seguendo lo stesso ragionamento, anche il programma stesso potrebbe essere cancellato, ma di questo vedo che non te ne preoccupi. Se, allora, il programma non è un problema, salvare il seriale dentro il programma stesso lo rende imperdibile: se venisse rimosso, significherebbe che non esiste più neanche il programma, ma in quel caso avresti altro di cui preoccuparti.
Invece di salvarlo in un file qualsiasi, lo salvi direttamente nel programma eseguibile, scrivendo i dati alla fine del file. Essendo legato da specifiche di formato, non dovrebbe causare problemi l'aggiunta di bytes alla fine dell'exe. Io l'ho fatto e non ho avuto problemi.
Certo, in questo modo l'aggiunta o la modifica dei seriali diventa più difficile. Vedi tu come procedere...
|
|
()
Newbie
Messaggi:
Iscritto:
|
Postato originariamente da Il Totem:
Invece di salvarlo in un file qualsiasi, lo salvi direttamente nel programma eseguibile, scrivendo i dati alla fine del file. Essendo legato da specifiche di formato, non dovrebbe causare problemi l'aggiunta di bytes alla fine dell'exe. Io l'ho fatto e non ho avuto problemi.
Certo, in questo modo l'aggiunta o la modifica dei seriali diventa più difficile. Vedi tu come procedere... |
Al posto di inserirlo alla fine dell'exe integralo come risorsa |
|
swet (Normal User)
Pro
Messaggi: 128
Iscritto: 01/01/2009
|
Cioè? Puoi spiegarmi cosa intendi? Grazie
|
|