Newsgroup: it.comp.lang.vo-clipper
Titolo: Chi Ha Aperto il mio DBF....?

Salve ...
    Il Thread mi è sembrato interessante, e nello stesso tempo ( anche non 
utilizzando i DBF ), mi è venuto in mente un interessante esempio pubblicato
dal grande :   Karl-Heinz Rauscher ( Tedesco : Per VO la linqua Tedesca che 
io non conosco neache in minima parte è di vitale importanza );
  Dove illustrava come utilizzare alcune API di windows per capire quali 
erano e da chi venivano aperti determinati files su un qualsiasi server in 
LAN.
  Le API sono le seguenti :
       NetFileEnum
       NetFileClose
      NetFileGetInfo
   Le funzioni che utilizzano quest api le ho testate personalmente e 
funzionano, una in particolare è quella che potrebbe servire per poter 
capire se un determinato file DBF è aperto e chi sono coloro che detengono 
gli handles.
   Per avere i files aperti su un server  :
   //
    LOCAL aRet    AS ARRAY
    LOCAL dwPos   AS DWORD
    LOCAL cDbf    AS STRING
   //
   aRet :=GetFilesOpenedOnServer ( 'MAGAZZINO' )
   cDbf :='CLIENTI.DBF'
  //
   WHILE TRUE
      //
       dwPos  :=  AScan(aRet,  { |a|   (cDbf $ a[2])  }, dwPos+1)
       IF dwPos=0
        EXIT
       ENDIF
       ?'User ', aRet[dwPos,1]
      //
   ENDDO
  //
Un Saluto a Tutti
Luigi De Palma
*/
*
*
*********************************************/
STRUCTURE _win_FILE_INFO_3
 MEMBER fi3_id AS DWORD
 MEMBER fi3_permissions AS DWORD
 MEMBER fi3_num_locks AS DWORD
 MEMBER fi3_pathname AS PTR // UNICODE
 MEMBER fi3_username AS PTR // UNICODE
FUNCTION CloseFileOpenedOnServer ( cServer := "" AS STRING , dwID AS DWORD ) 
AS LOGIC PASCAL
LOCAL lOk AS LOGIC
LOCAL dwStatus AS DWORD
LOCAL pServer, hLib, hFunc1 AS PTR
 IF ( hLib := LoadLibrary ( Cast2Psz ( "NETAPI32.DLL" ) ) ) != NULL_PTR
  IF ( hFunc1 := GetProcAddress ( hLib , Cast2Psz ( "NetFileClose"  ) )  ) 
!= NULL_PTR
   IF ! Empty ( cServer )
    IF SubStr ( cServer , 1 ,2 ) != "\\"
     pServer := String2W ( "\\" + cServer )
    ELSE
     pServer := String2W ( cServer )
    ENDIF
   ENDIF
   IF ( dwStatus := DWORD ( _CAST , PCALL ( hFunc1 , pServer , dwID ) )  ) 
== NERR_Success
                lOk := TRUE
   ENDIF
   IF pServer != NULL_PTR
    SysFreeString  ( pServer )
   ENDIF
  ENDIF
  FreeLibrary ( hLib )
    ENDIF
 IF dwStatus != 0
  SetLastError( dwStatus )
 ENDIF
 RETURN lOk
FUNCTION GetFilesOpenedOnServer ( cServer := "" AS STRING  ) AS ARRAY PASCAL
LOCAL bufTemp, struInfo3 AS _win_FILE_INFO_3
LOCAL dwStatus, dwEntriesread, dwTotalentries, dwResume_handle, 
dwPermissions, i AS DWORD
LOCAL cPermissions AS STRING
LOCAL aRet AS ARRAY
LOCAL pServer, hLib, hFunc1, hFunc2 AS PTR
 IF ( hLib := LoadLibrary ( Cast2Psz ( "NETAPI32.DLL" ) ) ) != NULL_PTR
  IF ( hFunc1 := GetProcAddress ( hLib , Cast2Psz ( "NetFileEnum"  ) )  ) != 
NULL_PTR  .and. ;
   ( hFunc2 := GetProcAddress ( hLib , Cast2Psz ( "NetApiBufferFree"  ) )  ) 
!= NULL_PTR
   IF ! Empty ( cServer )
    IF SubStr ( cServer , 1 ,2 ) != "\\"
     pServer := String2W ( "\\" + cServer )
    ELSE
     pServer := String2W ( cServer )
    ENDIF
   ENDIF
   IF ( dwStatus := DWORD ( _CAST , PCALL ( hFunc1 , pServer ,;
          NULL_PTR ,;
          NULL_PTR ,;
          3 ,;
          @struInfo3,;
          DWORD ( -1 )  ,;
          @dwEntriesread ,;
          @dwTotalentries ,;
       @dwResume_handle ) )  ) == NERR_Success
    IF dwEntriesread > 0
        bufTemp := struInfo3
        aRet := ArrayNew ( dwEntriesRead , 5 )
     FOR i := 1 UPTO dwEntriesRead
      cPermissions := ""
      aRet [ i , 1 ] := W2String ( bufTemp.fi3_username )
      aRet [ i , 2 ] := W2String ( bufTemp.fi3_pathname  )
      aRet [ i , 3 ] := bufTemp.fi3_num_locks
      dwPermissions := bufTemp.fi3_permissions
      IF _and ( dwPermissions , PERM_FILE_READ ) ==  PERM_FILE_READ
       cPermissions += "R"
      ENDIF
      IF _and ( dwPermissions , PERM_FILE_WRITE ) ==  PERM_FILE_WRITE
       cPermissions += "W"
      ENDIF
      IF _and ( dwPermissions , PERM_FILE_CREATE ) ==  PERM_FILE_CREATE
       cPermissions += "C"
      ENDIF
      IF Empty ( cPermissions )
       cPermissions := "none"
      ENDIF
      aRet [ i , 4 ] := cPermissions
      aRet [ i , 5 ] := bufTemp.fi3_id
         bufTemp ++
     NEXT
    ENDIF
   ENDIF
   PCALL ( hFunc2 , struInfo3 )
   IF pServer != NULL_PTR
    SysFreeString  ( pServer )
   ENDIF
  ENDIF
  FreeLibrary ( hLib )
    ENDIF
 IF dwStatus != 0
  SetLastError( dwStatus )
 ENDIF
 RETURN aRet

      NetFileGetInfo
Solo attenzione:
"Only members of the Administrators or Account Operators local group can 
successfully execute the NetFileEnum function."
E vale anche per le altre due.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 ha scritto nel
messaggio news:446c80c3$0$14782$4faf...@reader4.news.tin.it...


 scusa l'ignoranza, l'esempio puņ essere usato in xHarbour ?
Non esattamente come scritto in VO ma comunque le API di Windows si possono 
utilizzare.


 ha scritto nel messaggio
news:e4hu48$j6k$1...@emma.aioe.org...


 ha scritto nel 
messaggio news:446c80c3$0$14782$4faf...@reader4.news.tin.it...


 record
     Mi Sembra che il Thread Originale aperto da Paolo sia il seguente -<
     ho bisogno di un'aiuto su come visualizzare gli utenti che apro in rete 
un file dbf >.
Saluti
Luigi De Palma 

 , diversamente non potrei aprire i miei dbf  >
Ok, scusa ma non conosco bene queste questioni.


 ha scritto nel
messaggio news:446cb693$0$29727$4faf...@reader2.news.tin.it...


 hai un'esempio di utilizzo delle api in Harbour ?
Eccone uno (come vedi si usano le stesse API di Clipper con tre differenze: la 
macro HB_FUNC, il prefisso hb e il fatto che il codice C può essere scritto 
direttamente nel PRG grazie alle direttive #pragma BEGINDUMP/#pragma ENDDUMP):
FUNCTION MAIN()
    SHELLEXECUTE( 0, 0, ".", 0, 0, 1 )
    RETURN NIL
#pragma BEGINDUMP
#include "windows.h"
#include "hbapi.h"
HB_FUNC( SHELLEXECUTE )
{
    hb_retnl( ( LONG ) ShellExecute( ( HWND ) hb_parnl( 1 ), hb_parc( 2 ), 
hb_parc( 3 ), hb_parc( 4 ), hb_parc( 5 ), hb_parni( 6 ) ) );
}
#pragma ENDDUMP


 ha scritto nel
messaggio news:446d7682$0$36923$4faf...@reader3.news.tin.it...


 ha scritto nel messaggio
news:e4jr93$j88$2...@emma.aioe.org...
