Newsgroup: it.comp.lang.visual-basic
Titolo: Elenco PC in rete

Ciao a tutti. Vorrei solo sapere, per Win 95/98, quali Api servono per
ottenere la lista dei PC presenti su una rete locale. Magari anche un
piccolo esempio č ben gradito. Ciao.
--
CHE LA FORZA SIA CON VOI
E ricordatevi di visitare il sito :
http://digilander.iol.it/lamak

 piccolo esempio è ben gradito. Ciao.


 piccolo esempio è ben gradito. Ciao.
Ti faccio un esempio.
Il codice funziona solo in NT. Per farlo girare in Win9x
occorre compilare a 16 bit usando Netapi.dll, non Netapi32.dll.
In serata vedo di farne uno più concreto (se ho tempo).
' Costanti per i tipi di computer
' Esistono molte altre definizioni
Private Const SV_TYPE_WORKSTATION = &H1&
Private Const SV_TYPE_SERVER = &H2&
Private Const SV_TYPE_DOMAIN_CTRL = &H8&
Private Const SV_TYPE_NT = &H1000&
Private Const SV_TYPE_SERVER_NT = &H8000&
Private Const SV_TYPE_WINDOWS = &H400000
Private Const SV_TYPE_ALL = &HFFFF
' Custom Type usato da NetServerEnum
Private Type SERVER_INFO_101
   wki101_platform_id As Long
   wki101_servername As Long
   wki101_langroup As Long
   wki101_ver_major As Long
   wki101_ver_minor As Long
   wki101_lanroot As Long
End Type
' API
Private Declare Function NetServerEnum Lib "Netapi32" _
      (ByVal sServerName As String, _
       ByVal lLevel As Long, _
       vBuffer As Long, _
       lPreferedMaxLen As Long, _
       lEntriesRead As Long, _
       lTotalEntries As Long, _
       ByVal vServerType As Long, _
       ByVal sDomain As String, _
       vResume As Long) As Long
Private Declare Function NetApiBufferFree _
      Lib "Netapi32" _
      (ByVal lBuffer&) As Long
Private Declare Sub lstrcpyW _
      Lib "kernel32" _
      (vDest As Any, ByVal vSrc As Any)
Private Declare Sub RtlMoveMemory _
      Lib "kernel32" _
      (dest As Any, vSrc As Any, ByVal lSize&)
Private Declare Function GetComputerName _
      Lib "kernel32" Alias "GetComputerNameA" _
      (ByVal lpBuffer As String, _
       nSize As Long) As Long
Public Function GetServers() As Variant
   Dim pstrServerName         As String
   Dim pstrComputerName       As String
   Dim pstrDomainName         As String
   Dim pbytBuf(512)           As Byte
   Dim plngRtn                As Long
   Dim plngSrvInfoRtn         As Long
   Dim plngPreferedMaxLen     As Long
   Dim plngNumEntriesRead     As Long
   Dim plngTotalEntries       As Long
   Dim plngServerType         As Long
   Dim plngResume             As Long
   Dim plngCnt                As Long
   Dim lSeverInfo101StructPtr As Long
   Dim plngServEnumLevel      As Long
   Dim plngPos                As Long
   Dim ptypServerInfo101      As SERVER_INFO_101
   Dim plngLenComputerName    As Long
   Dim pvntComputers()        As Variant
   'Just in case. Meglio però una gestione
   'degli errori più definita.
   On Error Resume Next
   ' Initialize the variables
   pstrComputerName = vbNullString
   pstrServerName = vbNullString
   pstrDomainName = vbNullString
   plngServEnumLevel = 101
   'Questa variabile indica il tipo di server che si
   'intende elencare. E' possibile specificare SV_TYPE_ALL,
   'includendo anche Workstation Win95, Win98 ecc.
   'In questo caso cerca server NT Server o NT workstation
   plngServerType = SV_TYPE_NT
   ' NetServerEnum rende una lista dei Server del tipo indicato
   plngRtn = NetServerEnum(pstrServerName, _
         plngServEnumLevel, plngSrvInfoRtn, _
         plngPreferedMaxLen, plngNumEntriesRead, _
         plngTotalEntries, plngServerType, _
         pstrDomainName, plngResume)
   'L'indice inizia da 1. Occorre ciclare fino al numero
   'massimo di entries indicato per ottenere i nomi dei server
   plngCnt = 1
   lSeverInfo101StructPtr = plngSrvInfoRtn
   ReDim pvntComputers(1 To plngTotalEntries)
   For plngCnt = 1 To plngTotalEntries
      pstrComputerName = ""
      'Rende la struttura leggibile a VB
      RtlMoveMemory ptypServerInfo101, ByVal lSeverInfo101StructPtr, Len(ptypServerInfo101)
      lstrcpyW pbytBuf(0), ptypServerInfo101.wki101_servername
      pstrComputerName = pbytBuf
      plngPos = InStr(pstrComputerName, vbNullChar)
      If plngPos > 0 Then
         pstrComputerName = Mid$(pstrComputerName, 1, plngPos - 1)
      End If
      pvntComputers(plngCnt) = pstrComputerName
       O anche:
      'List1.AddItem pstrComputerName
      lSeverInfo101StructPtr = lSeverInfo101StructPtr + Len(ptypServerInfo101)
   Next plngCnt
   'Rialscia il buffer
   plngRtn = NetApiBufferFree(plngSrvInfoRtn)
   'GetServers ritorna l'elenco dei server ottenuti
   GetServers = pvntComputers
End Function

       (ByVal lBuffer&) As Long
scusa la mia totale ignoranza (un mix di 16 e 32 mi mancava...): non posso
compilare come al solito mettendo solo "netapi.dll" e "as integer" ?
tia, pal

 compilare come al solito mettendo solo "netapi.dll" e "as integer" ?
No. Non è possibile utilizzare una versione della DLL a 16
bit con una applicazione che utilizza puntatori a 32 bit.
Non fai altro che provare per vedere il risultato.
Purtroppo l'implementazione di LanMan in Win95 è solo
a 16 bit. Come scrivevo in un messaggio precedente, la
libreria Netapi32.dll in win95 serve solo per "tradurre" le
chiamate a 32 bit, passandole poi a Netapi.dll.
Risulta però che alcune funzioni, come per l'appunto
NetServerEnum, non abbiano l'Entry Point in Netapi32.
Mentre la funzione è ovviamente presente in netapi.dll.
Da cui risulta che occorre compilare a 16 bit per accedere
direttamente a netapi.dll. Oppure si potrebbe ricompilare
netapi32.dll includendo anche le funzioni mancanti.
Ma questa, chiaramente, è tutta un'altra faccenda.