Aquí encontré otro. Pruebas y nos comentas.
*!* *The code below (originally Ed's I believe) works in Windows NT, 2K,
*!* and XP, but not 95/98. How can this be done in Win 95/98?
*!*
*!* I need to retrieve a list of all computers on the network like
*!* the example below does for me and store them in the array Ausers:
Public Array aUsers(1)
aUsers(1)=""
Private i, lcNewRemote
i=0
lcNewRemote=""
Do Decl
#Define RESOURCE_CONNECTED 1
#Define RESOURCE_GLOBALNET 2
#Define RESOURCE_REMEMBERED 3
#Define RESOURCE_RECENT 4
#Define RESOURCE_CONTEXT 5
#Define RESOURCETYPE_ANY 0
#Define RESOURCETYPE_DISK 1
#Define RESOURCETYPE_PRINT 2
#Define RESOURCEUSAGE_CONNECTABLE 1
#Define RESOURCEUSAGE_CONTAINER 2
#Define RESOURCEUSAGE_ATTACHED 16
#Define RESOURCEUSAGE_ALL 19
#Define RESOURCEDISPLAYTYPE_DOMAIN 1
#Define RESOURCEDISPLAYTYPE_SERVER 2
#Define RESOURCEDISPLAYTYPE_GROUP 5
#Define RESOURCEDISPLAYTYPE_NETWORK 6
#Define RESOURCEDISPLAYTYPE_ROOT 7
#Define NO_ERROR 0
#Define ERROR_MORE_DATA 234
#Define ERROR_NO_MORE_ITEMS 259
#Define NETRESOURCE_SIZE 32
Local hEnum, lnResult
hEnum = 0
lnResult = WNetOpenEnum (RESOURCE_CONTEXT, RESOURCETYPE_ANY,;
0, 0, @hEnum)
If lnResult <> NO_ERROR
* ERROR_INVALID_PARAMETER = 87
* ERROR_NOT_CONTAINER = 1207
* ERROR_EXTENDED_ERROR = 1208
* ERROR_NO_NETWORK = 1222
lcMsg="Unable to start enumeration."
lcCode= lnResult
*? "Unable to start enumeration."
*? "Error code:", lnResult
Return
Endif
Local lnCount, lcBuffer, lnBufsize, ii, lcEntry
lnCount = -1 && requesting as many entries as possible
lnBufsize = 16384 && should be large enough
lcBuffer = Repli(Chr(0), lnBufsize)
lnResult = WNetEnumResource (hEnum, @lnCount,;
@lcBuffer, @lnBufsize)
If lnResult <> NO_ERROR
lcMsg= "WNetEnumResource call failed."
lcCode= lnResult
*?"Error code:", lnResult
*?"WNetEnumResource call failed."
Else
*? "Number of entries read:", lnCount
For ii=1 To lnCount
lcEntry = Substr(lcBuffer, (ii-1)*NETRESOURCE_SIZE + 1, NETRESOURCE_SIZE)
= SaveEntry(lcEntry)
Endfor
Endif
= WNetCloseEnum (hEnum)
If Used('csResult')
Use In csResult
Endif
Return
Procedure SaveEntry (lcEntry)
*|typedef struct _NETRESOURCE {
*| DWORD dwScope; 0:4
*| DWORD dwType; 4:4
*| DWORD dwDisplayType; 8:4
*| DWORD dwUsage; 12:4
*| LPTSTR lpLocalName; 16:4
*| LPTSTR lpRemoteName; 20:4
*| LPTSTR lpComment; 24:4
*| LPTSTR lpProvider; 28:4
*|} NETRESOURCE; total bytes = 32
Local lnScope, lnType, lnDisplayType, lnUsage,;
lcLocalName, lcRemoteName, lcComment, lcProvider
lnScope = buf2dword(Substr(lcEntry, 1,4))
lnType = buf2dword(Substr(lcEntry, 5,4))
lnDisplayType = buf2dword(Substr(lcEntry, 9,4))
lnUsage = buf2dword(Substr(lcEntry, 13,4))
lcLocalName = mem2str(buf2dword(Substr(lcEntry, 17,4)))
lcRemoteName = mem2str(buf2dword(Substr(lcEntry, 21,4)))
If Len(Alltrim(lcRemoteName))>2
lcNewRemote=Right(lcRemoteName,Len(Alltrim(lcRemoteName))-Rat('\\',lcRemoteName)-1)
If Alen(aUsers,1)=1 .And. aUsers(1)=""
aUsers(1)=lcNewRemote
Else
i=Alen(aUsers,1)+1
Dimension aUsers(i)
aUsers(i)=lcNewRemote
Endif
?lcNewRemote
Endif
lcComment = mem2str(buf2dword(Substr(lcEntry, 25,4)))
lcProvider = mem2str(buf2dword(Substr(lcEntry, 29,4)))
If Not Used("csResult")
Create Cursor csResult (dwscope N(16), dwtype N(16), dwdispl N(16),;
dwusage N(16), localname C(50), remotename C(50), Comment C(50),;
provider C(50))
Endif
Insert Into csResult Values (lnScope, lnType, lnDisplayType, lnUsage,;
lcLocalName, lcRemoteName, lcComment, lcProvider)
Return
Procedure Decl
Declare Integer WNetOpenEnum In mpr;
INTEGER dwScope, Integer dwType, Integer dwUsage,;
INTEGER lpNetResource, Integer @lphEnum
Declare Integer WNetCloseEnum In mpr Integer hEnum
Declare Integer WNetEnumResource In mpr;
INTEGER hEnum, Integer @lpcCount, String @lpBuffer,;
INTEGER @lpBufferSize
Function buf2dword (lcBuffer)
Return Asc(Substr(lcBuffer, 1,1)) + ;
BitLShift(Asc(Substr(lcBuffer, 2,1)), 8) +;
BitLShift(Asc(Substr(lcBuffer, 3,1)), 16) +;
BitLShift(Asc(Substr(lcBuffer, 4,1)), 24)
Function mem2str(lnMemBlock)
#Define BUFFER_SIZE 16
#Define EMPTY_BUFFER Repli(Chr(0), BUFFER_SIZE)
If lnMemBlock = 0
Return ""
Endif
Declare RtlMoveMemory In kernel32 As Heap2Str;
STRING @, Integer, Integer
Local lnPtr, lcResult, lcBuffer, lnPos
lnPtr = lnMemBlock
lcResult = ""
Do While .T.
lcBuffer = EMPTY_BUFFER
= Heap2Str (@lcBuffer, lnPtr, BUFFER_SIZE)
lnPos = At(Chr(0), lcBuffer)
If lnPos > 0
lcResult = lcResult + Substr(lcBuffer, 1, lnPos-1)
Return lcResult
Else
lcResult = lcResult + lcBuffer
lnPtr = lnPtr + BUFFER_SIZE
Endif
Enddo