Newsgroup: it.comp.lang.delphi
Titolo: Serial number

Ho un applicazione che controlla il numero seriale dell'HD su cui e'
installata.Se l'applicazione viene chiamata localmente non vi sono problemi,
ma se viene chiamata da un altro pc collegato in rete non mi restituisce
niente (questo e' successo da un cliente mentre in ufficio non mi ha dato
problemi).
La funzione che utilizzo e':
RootPath:=UpperCase(ExtractFileDrive(Application.ExeName))+'\';
  StrPCopy(Drive,RootPath);
  GetVolumeInformation(Drive,VolName, 255, @SerialNumber, MaxCLength,
                       FileSysFlag, FileSysName, 255);
(non mi restituisce neppure VolName)
Non so se la uso scorrettamente oppure se non e' il metodo giusto per
ottenere il numero di serie anche in rete.
Grazie a chiunque tenti di aiutarmi.
                                                         Massimiliano

 wrote

io la usavo così:
function GetSerialNumber(Directory:PChar):DWORD;stdcall;
var MaximumComponentLength :DWORD;
    FileSystemFlags        :DWORD;
begin
  if not GetVolumeInformation(Directory,
                              nil,
                              0,
                              @Result,
                              MaximumComponentLength,
                              FileSystemFlags,
                              nil,
                              0) then Result:=-1;
end;
forse anche il tuo codice è giusto, ma non l'ho nemmeno letto.
Però, il problema potrebbe essere altrove.
Quando via rete lanci un eseguibile che sta su un'altro PC, questo viene
eseguito nel PC da dove lo avvii, non nel tuo ( in quello dove risiede
l'eseguibile ) !! Altrimenti se non fosse così, immagina che hai un PC con
Win3.1 collegato ad un PC con Windows 95, dal PC con Win 3.1 potresti
avviare programmi a 32 bit visto che questi dovrebbero girare sul PC con
Windows 95. Col cavolo.
Quanto dici tu è possibile con "PCAnyWhere" che esegue il programma su
server e nel client vedi i risultati.
Quindi il comportamento che riporti, me lo spiego solo in questa maniera che
descrivo quì sotto.
Il tuo amico dal suo PC lancia l'eseguibile che sta nel tuo PC. Il codice
del tuo eseguibile viene eseguito sul suo PC, e la GetVolumeInformation fa
il controllo sul suo HD, non su quello dove risiede veramente l'eseguibile.
Visto che i serial number sono diversi, il controllo fallisce e non vedi
nulla. Ma questo perchè il tuo programma non mostra nessun messaggio nel
caso il serial number rilevato è diverso da quello impostato.
Per risolvere la cosa, le strade sono tre:
1) nel codice sorgente aggiungi il serial del tuo amico in modo che il
programma funzioni in entrambi i PC.
2) c'è una vecchia utility della Norton che permette di correggere il serial
number dell' HD che infine viene assegnato con uno strano algoritmo durante
la formattazione. ( se non erro ) Brutta strada comunque.
3) questa forse è la soluzione migliore. La "GetVolumeInformation" dovrebbe
fare il controllo sul PC specifico ( il tuo ). Come fare ?
Bè.....semplice. Se tu specifichi una directory di path con solo il nome del
drive ad esempio, la funzione fallisce come ti ho detto sopra.
Ma se tu imposti un path del genere, dovrebbe andar bene:
\\nome_computer_tuo\c
o qualcosa del genere.
In questo modo, l' API andrà a controllare quel path riferito al tuo
computer, non quello del PC del tuo amico che sta in rete !!!
Quanto ti ho detto, dovrebbe essere giusto e funzionare. Altrimenti per il
momento non ho altra diagnosi !! :-)))
Ti saluto......ciao.
Antonio Tarolla

 problemi).
E' strano, la funzione seguente l'ho scritta su una macchina NT Workstation.
In locale, mi restituisce il serial number della macchina locale, se la copio
su una macchina con W98 (in una cartella condivisa) e la lancio sulla macchina
con NT, mi restituisce (giustamente) il serial della macchina remota.
procedure TForm1.Button1Click(Sender: TObject);
var SerialNum: DWORD;
    MaxCompLength: DWORD;
    FileSystemFlags: DWORD;
begin
  GetVolumeInformation(PChar(ExtractFileDrive(Application.ExeName)+'\'),
                       nil,
                       0,
                       @SerialNum, MaxCompLength, FileSystemFlags, nil, 0) ;
  ShowMessage(Format('%.4x-%.4x', [(SerialNum and $FFFF0000) shr 16,
                                     SerialNum and $0000FFFF]));
end;
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 \\nome_computer_tuo\c
Lo fa gia' ExtractFileDrive, che lui gia' usa.


 Lo fa gia' ExtractFileDrive, che lui gia' usa.
già, hai ragione. Se leggevo il codice e pure l'help forse avrei pensato la
tua stessa cosa.
Ti saluto....ciao !!
Antonio Tarolla

ed in cosa differisce la tua funzione rispetto a quella da lui postata ?
Nella generazione del RootPath
--
Andrea Laforgia - walkietalkie(at)
libero.it
http://www.geocities.com/AndreaLaforgia

 Nella generazione del RootPath
allora se non l'hai ancora fatto, ti basta solo inviargliela !! :-)))


allora se non l'hai ancora fatto, ti basta solo inviargliela !! :-)))
Ma i messaggi li leggi o no ?
Per funzione, intendo il codice che ho postato nell'altro
messaggio.


 messaggio.
sorry.......colpa di OE immagino. Altrimenti non ti avrei chiesto in cosa
differiva la tua funzione rispetto alla sua.
Mi segnala un tuo messaggio, ma dice che č scaduto !!!
Ciň non mi sorprende. Ogni tanto succede. So che il tuo messaggio realmente
non č scaduto perchč una volta, la stessa cosa era successa con un mio
messaggio che ho inviato sul newsgroup ma subito dopo quando ho tentato di
scaricarlo diceva che era scaduto !!! :-))))
Mah....l'importante č che il nostro amico ha la funzione.
