:: Архив конференции по VFP до 2005 года
GetVolumeInformation
Александр Жевелев
Автор

Сообщений: 2723
Откуда: Новосибирск
Дата регистрации: 09.10.2003
Подскажите,
почему я получаю ошибку "Численное переполнение " на одной машине (примерно из 190)
фрагмент
DECLARE Integer GetVolumeInformation In Win32Api;
String @ Rootn, String @ Voln, Integer V_Lenn,;
Integer @ SNn, Integer @ kmn, Integer @ Fln,;
String @ Sys_fn, Integer S_Lenn
Rootn='c:\'
Voln=Space(256)
V_lenn=256
snn=0
kmn=256
Fln=0
Sys_fn=Space(256)
s_lenn=256
lcOldError = On('error')
on error gri=0
gri=GetVolumeInformation ;
(@Rootn,@Voln,V_Lenn,@SNn,@kmn,@Fln,@Sys_fn,@S_Lenn)
Ratings: 0 negative/0 positive
Re: GetVolumeInformation
Игорь Л.

Сообщений: 164
Откуда: Евпатория
Дата регистрации: 26.11.2003
Может надо сделать Space(255) вместо Space(256) ?




------------------
И все мы делаем! Козьма Прутков
Ratings: 0 negative/0 positive
Re: GetVolumeInformation
Syberex

Сообщений: 1432
Откуда: Кострома
Дата регистрации: 19.01.2004
Почитай вот здесьwww.foxhelp.ru
статью Юрия Шутенко про Win 32 API,
там про класс Struct (сам класс ищи в решениях).
Проблема видимо в буферах lpVolumeNameBuffer и lpFileSystemNameBuffer
в которые функция вернет данные. Для них надо выделить память сразу за структурой...





------------------
Ratings: 0 negative/0 positive
Re: GetVolumeInformation
JS

Сообщений: 12264
Откуда: Эстония
Дата регистрации: 04.09.2000
Альтернативы:
lcComputer = "."
CLEAR
loWMIService = GetObject("winmgmts:" ;
+ "{impersonationLevel=impersonate}!\\" + lcComputer + "\root\cimv2")
colDisks = loWMIService.ExecQuery ;
("Select * from Win32_LogicalDisk")
For each loDisk in colDisks
?"Compressed: " + chr(9) + TRANSFORM(loDisk.Compressed)
?"Description: " + chr(9) + loDisk.Description
?"DeviceID: " + chr(9) + loDisk.DeviceID
?"DriveType: " + chr(9) + TRANSFORM(loDisk.DriveType)
?"FileSystem: " + chr(9) + loDisk.FileSystem
?"FreeSpace: " + chr(9) + loDisk.FreeSpace
?"MediaType: " + chr(9) + TRANSFORM(loDisk.MediaType)
?"Name: " + chr(9) + loDisk.Name
?"QuotasDisabled: " + chr(9) + loDisk.QuotasDisabled
?"QuotasIncomplete: " + chr(9) + loDisk.QuotasIncomplete
?"QuotasRebuilding: " + chr(9) + loDisk.QuotasRebuilding
?"Size: " + chr(9) + loDisk.Size
?"SupportsDiskQuotas: " + chr(9) + ;
TRANSFORM(loDisk.SupportsDiskQuotas)
?"SupportsFileBasedCompression: " + chr(9) + ;
TRANSFORM(loDisk.SupportsFileBasedCompression)
?"SystemName: " + chr(9) + loDisk.SystemName
?"VolumeDirty: " + chr(9) + TRANSFORM(loDisk.VolumeDirty)
?"VolumeName: " + chr(9) + loDisk.VolumeName
?"VolumeSerialNumber: " + chr(9) + ;
loDisk.VolumeSerialNumber
Next


LOCAL loFSO, loDrivesCol, loDrive, ;
llIsReadyDrive, lnDriveType, lcDriveType, lnWait
loFSO = CREATEOBJECT('Scripting.FileSystemObject')
loDrivesCol = loFSO.Drives
? "Number of the drives in system is " + ALLTRIM(STR(loDrivesCol.Count))
FOR EACH loDrive IN loDrivesCol
? "Drive : " + loDrive.DriveLetter
lnDriveType = loDrive.DriveType
DO CASE
CASE lnDriveType=1
lcDriveType = [removable]
CASE lnDriveType=2
lcDriveType = [fixed]
CASE lnDriveType=3
lcDriveType = [network]
CASE lnDriveType=4
lcDriveType = [CD-ROM]
CASE lnDriveType=5
lcDriveType = [RAM-disk]
ENDCASE
? "Drive type is: " + lcDriveType
llIsReadyDrive = loDrive.IsReady
? IIF( llIsReadyDrive=.T., [Drive is ready.],[Drive isn't ready.])
IF llIsReadyDrive
? "Available space: " + ALLTRIM(STR(loDrive.AvailableSpace)) + [ bytes.]
? "Free space: " + ALLTRIM(STR(loDrive.FreeSpace)) + [ bytes.]
? "Total size: " + ALLTRIM(STR(loDrive.TotalSize)) + [ bytes.]
? "Path: " + loDrive.Path
? "Volume name: " + loDrive.VolumeName
ENDIF
IF INLIST(lnDriveType,1,2,4) AND llIsReadyDrive
? "Serial number: " + ALLTRIM(STR(loDrive.SerialNumber))
ENDIF
IF lnDriveType=3
? "Share name: " + loDrive.ShareName
ELSE
IF lnDriveType=2
? "Share name: " + RTRIM(LEFT(SYS(0),15))
ENDIF
ENDIF
WAIT
CLEAR
NEXT


Работающий код с вызовом WinAPI

FUNCTION GetVolumeSerial(tcDrive)
IF PCOUNT() = 0
tcDrive = "C:\"
ELSE
tcDrive = STRTRAN(tcDrive, ":\", "") + ":\"
ENDIF
LOCAL lcName, lcFSName, lnVolumeSerial, ;
lnFMaxLen, lnFSFlags, ;
lcVolumeSerial, lnNameLen, lnFSNameLen
STORE SPACE(255) TO lcName, lcFSName
STORE 0 TO lnVolumeSerial, lnFMaxLen, lnFSFlags
STORE 255 TO lnNameLen, lnFSNameLen
DECLARE GetVolumeInformation IN win32api STRING, STRING @, ;
INTEGER, INTEGER @, INTEGER @, INTEGER @, STRING @, INTEGER
=GetVolumeInformation(tcDrive, @lcName, lnNameLen, ;
@lnVolumeSerial, @lnFMaxLen, @lnFSFlags, @lcFSName, lnFSNameLen)
CLEAR DLLS GetVolumeInformation
IF EMPTY(lnVolumeSerial)
RETURN ""
ELSE
IF lnVolumeSerial < 0
lnVolumeSerial = 4294967296 + lnVolumeSerial
ENDIF
lcVolumeSerial = SUBSTR(TRANSFORM(lnVolumeSerial,"@0"), 3)
RETURN lcVolumeSerial
ENDIF
ENDFUNC




------------------
Knowledge is better than ignorance!
Website: juri.foxhelp.eu
Ratings: 0 negative/0 positive
Тема закрыта
Александр Жевелев
Автор

Сообщений: 2723
Откуда: Новосибирск
Дата регистрации: 09.10.2003
Всем спасибо!
тема закрыта! Все работает.
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 9 (Гостей: 9)

© 2000-2024 Fox Club 
Яндекс.Метрика