Newsgroup: it.comp.lang.visual-basic
Titolo: Domanda per programmatori esperti

Salve a tutti,
sapreste spiegarmi, gentilmente, cosa devo fare per fare in modo che il mio
programma copi dei file su un altro pc collegato alla stessa rete locale?
Vorrei evitare che l'utente del pc che riceve i file condivida una cartella
manualmente, si può fare questo con VB, magari utilizzando le API?
Quale API usa windows 9x quando condividiamo una cartella, posso usare le
stesse funzioni?
Grazie mille
--
Vincenzo Giacalone
vinceg...@inwind.it
vinceg...@tiscalinet.it
Togliere NOSPAM dall'indirizzo di posta elettronica

Non saprei come sia possibile condividere da programma una cartella.
Senza condividere manualmente un drive o una cartella *e* nell'impossibilità di farlo da
programma, c'e' una sola altra strada: scrivere un programma client/server che sfrutti i
Winsock per trasferire i documenti... (oppure con un programma di ftp?)


 ha scritto nel messaggio
news:9an2pd$b5$1...@nreadA.inwind.it...


 aiutarmi?
Ma guarda un po' !!! E' la vecchia NetShareAdd, ed è supportata anche dal
9x! anche se in maniera limitata.
Non si finisce mai di imparare (dubitavo a torto, ottima ricerca :-)
allora, vediamo un po'... dando per buona la dichiarazione in C su msdn, in
VB dovrebbe fare più o meno così: (anche se l'uso degli short non mi
convince tanto)
public const NAMELEN = LM20_NNLEN+1
public const PSWLEN = SHPWLEN+1
public type SHARE_INFO
    netname as string * NAMELEN
    type as byte
    flags as integer
    remark as string
    path as string
    rw_password as string * PSWLEN
    ro_password as string * PSWLEN
end type
declare function netshareadd lib "svrapi.dll" (byval strServer as string,
byval nlevel as integer, pbuffer as SHARE_INFO, byval sizebuffer as
integer) as long
Purtroppo il valore delle costanti LM20_NNLEN e SHPWLEN non sono riuscito a
trovarlo su msdn (non ho l'header della svrapi.dll)
Spero che qualcun altro potrà venirti in aiuto.
P.S. Se schianta vorrà dire che ho sbagliato qualcosa - non prendertela a
male -
P.S.2 Non c'era bisogno di aprire un altro thread.
Ciao.
--
Princi, 
princ...@programmer.net
----------------------------------------------------------------------
"Tutti sanno che una cosa è impossibile da realizzare,
finché arriva uno sprovveduto che non lo sa e la inventa." A.E.

Spero che qualcun altro potrą venirti in aiuto.
sperando che sia quello giusto:
da LMCONS.H
#define LM20_NNLEN  12                  // LM 2.0 Net name length
#define SHPWLEN     8                   // Share password length (bytes)
Se ti funzionasse il tutto, sarebbe carino se postassi il frammento di codice che usa la NetShareAdd
o, addirittura, scrivere un esempietto per il sito comune.
ciao, hal

Ho trovato una dichiarazione alternativa dell'API:
Declare Function NetShareAdd Lib "netapi32.dll" ( ByVal lptstr As String, ByVal dword As
Long, ByVal pbyte As String, ByRef pdword As Long) As Long
ma forse non serviva...?


ma forse non serviva...?
Per capirci, le dichiarazioni originali, prese da msdn, sono:
Only members of the Administrators or Account Operators local group or those with Communication, Print, or Server operator group membership can successfully execute the NetShareAdd function. The Print operator can add only Printer queues. The Communication operator can add only communication-device queues.
Windows NT/2000: The parameter order is as follows.
NET_API_STATUS NetShareAdd(
  LPWSTR servername, 
  DWORD level,       
  LPBYTE buf,        
  LPDWORD parm_err   
);
Windows 95/98: You must specify the size of the information buffer, in bytes, using the cbBuffer parameter. The Windows NT/Windows 2000 parm_err parameter is not available on this platform. Therefore, the parameter list is as follows. 
extern API_FUNCTION
 NetShareAdd(
  const char FAR * pszServer,       
  short sLevel,                     
  const char FAR * pbBuffer,        
  unsigned short  cbBuffer          
);
quindi e' buona anche la dichiarazione che hai trovato, ma e' pensata per nt.
Su 
http://d.m.free.fr/VBnet.htm
 c'e' un esempio di Didier Moreau (
moreau...@free.fr
)
che ricopio qui per comodita' di documentazione, sperando che l' autore gradisca :)
(Preciso che non ho testato il codice, lasciando il compito ai miei venticinque lettori :)
-----------------------------
per Windows 9x
dim Connst STYPE_DISKTREE = 0 'Partage d'un répertoire
public Type SHARE_INFO_50 
shi50_netname(0 To 12) As Byte 'LM20_NNLEN + 1
shi50_type As Byte 'EShareType
shi50_flags As Integer
shi50_remark As Long
shi50_Path As Long
shi50_rw_password(0 To 8) As Byte 'SHPWLEN + 1
shi50_ro_password(0 To 8) As Byte 'SHPWLEN + 1
End Type
dim Const SHI50F_RDONLY = &H1
dim Const SHI50F_FULL = &H2
dim Const SHI50F_DEPENDSON = SHI50F_RDONLY+SHI50F_FULL
dim Const SHI50F_ACCESSMASK=SHI50F_RDONLY+SHI50F_FULL
dim Const SHI50F_PERSIST = &H100 'partage persistant
dim Const SHI50F_SYSTEM = &H200 'Partage caché
Declare Function NetShareAdd95 Lib "SVRAPI" Alias "NetShareAdd" _
(ByVal servername As String, _
ByVal level As Integer, _
ByVal buf As Long, _
ByVal cbBuffer As Integer) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Sub ShareResource( path As String, ShareName As String, remark As String)
Dim si50 As SHARE_INFO_50
Dim iErrParam As Integer
Dim lpszPath() As Byte
Dim lpszRemark() As Byte
Dim ShareType As Byte
flags = SHI50F_FULL Or SHI50F_PERSIST 'mode normal le partage est visible sur la machine
' flags = SHI50F_FULL Or SHI50F_PERSIST Or SHI50F_SYSTEM 'mode système partage invisible
ShareName = UCase(ShareName) 'nom de partage
path = UCase(path) 'répertoire à partager
lpszPath = StrConv(path, vbFromUnicode) & vbNullChar
lpszRemark = StrConv(remark, vbFromUnicode) & vbNullChar
With si50
StrToByte ShareName, VarPtr(.shi50_netname(0))
.shi50_type = STYPE_DISKTREE
.shi50_remark = VarPtr(lpszRemark(0))
.shi50_Path = VarPtr(lpszPath(0))
StrToByte "", VarPtr(.shi50_ro_password(0))
StrToByte "", VarPtr(.shi50_rw_password(0))
.shi50_flags = flags
End With
lreturnvalue = NetShareAdd95("", 50, ByVal VarPtr(si50), LenB(si50))
Select Case lreturnvalue
Case 0 'OK
Case 2102 'NERR_NERR_NetNotStarted
Case 2114 'NERR_ServerNotStarted
Case 2118 'NERR_ServerNotStarted
Case 2310 'NERR_NetNameNotFound
Case 124 'ERROR_INVALID_LEVEL
Case 2123 'NERR_BufTooSmall
Case 2127 'NERR_RemoteErr
Case 234 'ERROR_MORE_DATA
Case 87 'ERROR_INVALID_PARAMETER
Case Else:
End Select
End Sub
Private Sub StrToByte(strInput As String, ByVal lpByteArray As Long)
Dim lpszInput() As Byte
lpszInput = StrConv(strInput, vbFromUnicode) & vbNullChar
CopyMemory ByVal lpByteArray, lpszInput(0), UBound(lpszInput)
End Sub
------------------------------------------------------------------------------
per windows NT
STYPE_DISKTREE = 0 'Disk drive
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Type SHARE_INFO_2
netname As String
type As Long
remark As String
permissions As Long
max_uses As Long
current_uses As Long
path As String
passwd As String
End Type
Private Declare Function NetShareAddNT Lib "NETAPI32" Alias "NetShareAdd" (ByVal servername As String, ByVal level As Long, buf As SHARE_INFO_2, ByVal parm_err As Long) As Long
Global Serveur As String * 16
Global Recurso As String
Public Sub shareNT(disque As String, partage As String, valeur As Integer, remarque As String)
On Error Resume Next
Dim n As Long
Dim bufNT As SHARE_INFO_2
Dim error As Long
n = 0
bufNT.netname = StrConv(partage & vbNullChar, vbUnicode)
bufNT.type = 0 ' STYPE_DISKTREE
bufNT.remark = StrConv(remarque & vbNullChar, vbUnicode)
bufNT.permissions = 0
bufNT.max_uses = -1
bufNT.current_uses = 0
bufNT.path = StrConv(disque & vbNullChar, vbUnicode)
bufNT.passwd = StrConv("" & vbNullChar, vbUnicode)
n = NetShareAddNT(StrConv("", vbUnicode), 2, bufNT, error)
Select Case lreturnvalue
Case 0 'OK
Case 2102 'NERR_NERR_NetNotStarted Networking has not been started on this computer.
Case 2114 'NERR_ServerNotStarted The server has not been started on this computer
Case 2118 'NERR_ServerNotStarted The name has already been shared
Case 2310 'NERR_NetNameNotFound The computer was not found
Case 124 'ERROR_INVALID_LEVEL Invalid level for server_info structure
Case 2123 'NERR_BufTooSmall The buffer size specified for the server_info structure was too small
Case 2127 'NERR_RemoteErr There has been an error on the remote computer
Case 234 'ERROR_MORE_DATA More data is available
Case 87 'ERROR_INVALID_PARAMETER An invalid parameter has been passed to NetShareAdd
Case Else:
End Select
End Sub
Function version_windows() As Integer
Dim n As Long
Dim error As Long
Dim v As OSVERSIONINFO, retval As Long
Dim WindowsVersion As String, BuildVersion As String
Dim PlatformName As String
v.dwOSVersionInfoSize = Len(v)
retval = GetVersionEx(v)
WindowsVersion = v.dwMajorVersion & "." & v.dwMinorVersion
BuildVersion = v.dwBuildNumber And &HFFFF&
Select Case v.dwPlatformId
Case VER_PLATFORM_WIN32_NT:
If WindowsVersion <> "5.0" Then
version_windows = 1
Else
version_windows = 0
End If
Case Else: version_windows = 0
End Select
End Function
-------------------------------------------------------------------
Scusate la schifezza di indentazione, ma mi sono limitato a fare copia/incolla.
ciao, hal

 >ma forse non serviva...?
[..]

ho provato la funzione che hai postato e sembra funzionare solo che usa la
struttura share_info_50. Ho controllato la struttura share_info_502 e sembra
sia più completa ma non riesco ad usarla perchè si blocca VB.
Qualcuno potrebbe darci un'occhiata se ha un po di tempo e voglia e vedere
se si riesce a cavare fuori una funzione utile?
Sembra che la 502 permetta nella condivisione di decidere se in lettura,
scrittura o tutti e  due.
Grazie
Ciao, Vincenzo

 sia più completa ma non riesco ad usarla perchè si blocca VB.
Ciao Vincenzo,
a detta dell'MSDN Win9x supporta *solo* la SHARE_INFO_50. Secondo me è già
un ottimo risultato poter usare la NetShareAdd() in maniera limitata (credo
cmq che l'impostazione lettura/scrittura la puoi eseguire lo stesso -
altrimenti non avrebbe senso gestire la doppia password)
