Newsgroup: it.comp.lang.delphi
Titolo: Programma su server, esecuzione locale

Ciao a tutti,
     come da oggetto il programma e' installato sul server (chiamato server, 
che fantasia eh !!) ma l'esecuzione e' fatta da un pc in rete.
Il programma viene lanciato, dal pc in rete, tramite un'icona che ha come 
collegamento " \\server\c\test\test.exe".
Quello che succede e' una visualizzazione di una finestra con i dati di 
logIn, nome e password.
Subito dopo viene mostrata una form con un bottone (close) e un memo che 
visualizza il nome dell'utente o degli utenti loggati, il nome del pc dal 
quale si sono collegati.
Il problema che ho, sono ancora in fase di 'studio', e' come fare a 
controllare la presenza degli operatori.
Infatti se qualsiasi utente esce in modo corretto dal programma, non ci sono 
problemi, tutto ok; i problemi sorgono se l'utente esce in modo sbagliato, 
per esempio con un reset o mancanza rete.
Quello che ho fatto e' stato mettere un campo "connesso" che, dopo il login, 
viene settato e true, ed un campo "computer" che viene settato con il nome 
del computer in uso. Se si esce in modo normale il tutto viene azzerato, in 
caso contrario le informazioni rimangono memorizzate.
Una soluzione sarebbe quella, alla partenza del programma prima di sattere 
nome e pc, di controllare il db degli utenti. Se trovo un utente (pippo) con 
il flag di connessione a true controllo da quale pc si e' collegato (il nome 
del pc e' stato memorizzato in precedenza) e verifico se esiste una 
connessione con quel pc, se si ricontrollo nuovamente il db degli utenti e 
se trovo un altro untente collegato da qul pc lo resetto, se non c'e' 
connessione lo resetto.
Ecco i due problemi :
1) Non so come verificare la connessione di un pc nella rete.
2) Se ho due utenti con nomi diversi loggati dallo stesso pc (uno reale on 
line nel momento giusto, l'altro fittizio era collegato poi ha premuto 
reset) com'e' possibile capire quali dei due e' il reale e quale il 
fittizio???
Tutto questo perche' lavoro su un pc in rete e il programma, scritto in 
cobol, e' su server. In qualunque modo io esca dal quel programma al lancio 
successivo mi dice anche in che modo sono uscito; non solo ma visto siamo in 
5 ed usiamo lo stesso programma da 5 pc diversi, se sono collegato posso 
vedere (con un bottoncino) chi e' collegato in quel momento e se spengo il 
pc (quindi esco in modo anomalo) nella finestra degli utenti collegati il 
mio nome viene cancellato.
Ora, se sono riusciti a farli in cobol, perche' non si dovrebbe riuscire a 
farlo in delphi ???
Come di consueto, delpho 6.o e XP SP 3 (su tutte la macchine), la rete e' 
gestita da xp pro a casa e windows server 2003 (non so che versione) in 
ufficio; Il tutto e' ancora in una fase embrionale di studio, ma credo che 
sia di interesse a tutti.
Scusate per la lungaggine e grazie per l'aiuto.
Ciao, Daniele 

per risolvere il problema puoi al momento del log del client ricevere
l'indirizzo ip dello stesso e successivamente ogni tot secondi dal
server effettuare un ping ad ogni client per vedere quelli "in vita",
ciao Brunello

collegamento " &#124;&#124;server\c\test\test.exe".

Ciao,
secondo me la tabella utenti dovrebbe diventare la tabella delle 
postazioni di lavoro, cioè per ogni Pc ci deve essere un record che lo 
identifica attraverso il Mac-Address della scheda di rete, al momento 
del log-in recuperi il mac-address del Pc, cerchi nella tabella il 
relativo valore ed inserisci nel campo utente il nome di chi fa il log-
in. Al log-out fai l'operazione inversa cioè cancelli dal campo utente 
il nome (rendi il campo blank non cancelli il record).
Quindi se al log-in trovi il campo utente già compilato vuol dire che 
non è stato fatto il log-out correttamente, poi in questo caso devi 
provvedere a gestire questa cosa nel senso di impedire il log-in 
all'utente o forzalo, vedi tu ...
Se ti occorre di seguito la funzione per recuperare il MacAddress
function GetMACAddress: String;
Type
    TGUID=record
        A,B:word;
        D,M,S:word;
        MAC:array[1..6] of byte;
    end;
var
    UuidCreateFunc : function (var guid: TGUID):HResult;stdcall;
    handle : THandle;
    g:TGUID;
    WinVer:_OSVersionInfoA;
    i:integer;
begin
    WinVer.dwOSVersionInfoSize := sizeof(WinVer);
    getversionex(WinVer);
    handle := LoadLibrary('RPCRT4.DLL');
    if WinVer.dwMajorVersion >= 5 then {Windows 2000 }
        @UuidCreateFunc := GetProcAddress(Handle, 'UuidCreateSequential')
    else
        @UuidCreateFunc := GetProcAddress(Handle, 'UuidCreate') ;
    UuidCreateFunc(g);
    result:='';
    for i:=1 to 6 do
        result:=result+IntToHex(g.MAC[i],2);
end;
Ciao
Stefano
--- posted by geoForum on 
http://www.delphiedintorni.it