|
PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач. |
03.10.2008, 19:07
|
#1
|
ПроЭктировщик
Регистрация: 05.08.2006
Сообщений: 183
Написано 107 полезных сообщений (для 410 пользователей)
|
Помогите, вылетает Invalid Memory Acces
Помогите, пожалуйста, кто нибудь. При компилляции вылетает на втором (i=1) цикле на строке *L_Serial=AllocateMemory(4). Только не надо говорить о неразумном расходовании памяти, в программе и не такое может встретиться. Пробовал компилить на PB 4.01 и 4.20. В чем тут ошибка не пойму
;OpenLibrary(0, "kernel32.DLL")
For i=0 To 25
Debug i
*S_Drive=AllocateMemory(256)
PokeS(*S_Drive,Chr(65+i)+":\")
*S_Volume=AllocateMemory(256)
PokeS(*S_Volume,Space(256))
*L_Volume=AllocateMemory(4)
PokeL(*L_Volume,256)
*L_Serial=AllocateMemory(4)
PokeL(*L_Serial,0)
*L_Max=AllocateMemory(4)
PokeL(*L_Max,0)
*L_Flags=AllocateMemory(4)
PokeL(*L_Flags,0)
*S_FileSys=AllocateMemory(256)
*L_FileSys=AllocateMemory(4)
PokeL(*L_FileSys,256)
;res=CallFunction(0, "GetVolumeInformationA",*S_Drive,*S_Volume,*L_Volume,*L_Serial,*L_Max,*L_Flags,*S_FileSys,*L_FileSys)
If res=1
Debug "path "+PeekS(*S_Drive)
Debug "volume name "+ PeekS(*S_Volume)
Debug "Serial "+Str(PeekL(*L_Serial))
Debug "Flags "+Str(PeekL(*L_Flags))
Debug "File system "+PeekS(*S_FileSys)
EndIf
*S_DriveName=AllocateMemory(256)
PokeS(*S_DriveName,Chr(65+i)+":\")
*L_Free=AllocateMemory(8)
PokeQ(*L_Free,0)
*L_Total=AllocateMemory(8)
PokeQ(*L_Total,0)
*L_Avial=AllocateMemory(8)
PokeQ(*L_Avial,0)
; res=CallFunction(0, "GetDiskFreeSpaceExA",*S_DriveName,*L_Free,*L_Total,*L_Avial)
If res=1
Debug "path "+PeekS(*S_Drive)
Debug "Free "+Str(PeekQ(*L_Free)/1048576)
Debug "Total "+Str(PeekQ(*L_Total)/1048576)
Debug "Aviable "+Str(PeekQ(*L_Avial)/1048576)
EndIf
Next
|
(Offline)
|
|
05.10.2008, 20:34
|
#2
|
Оператор ЭВМ
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений (для 30 пользователей)
|
Ответ: Помогите, вылетает Invalid Memory Acces
Жжошь Выделять по 4 байта памяти на переменные это сильно, да
Define.s root_name, volume_name, system_name
Define.l volume_serial, max_length, system_flags
Define.q free_bytes_avail, total_bytes, total_free_bytes
volume_name = Space(#MAX_PATH)
system_name = Space(#MAX_PATH)
drives_avail = GetLogicalDrives_()
For i = 0 To 31
If ((drives_avail >> i) & 1)
root_name = Chr(i + 65) + ":\"
If (GetVolumeInformation_(root_name, @volume_name, #MAX_PATH, @volume_serial, @max_length, @system_flags, @system_name, #MAX_PATH))
Debug "Root name " + root_name
Debug "Volume name " + volume_name
Debug "Serial " + Hex(volume_serial)
Debug "Flags " + Str(system_flags)
Debug "File system " + system_name
EndIf
If (GetDiskFreeSpaceEx_(root_name, @free_bytes_avail, @total_bytes, @total_free_bytes))
Debug "Free bytes available " + Str(free_bytes_avail >> 20)
Debug "Total bytes " + Str(total_bytes >> 20)
Debug "Total free bytes " + Str(total_free_bytes >> 20)
EndIf
EndIf
Next
End
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.10.2008, 20:47
|
#3
|
Оператор ЭВМ
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений (для 30 пользователей)
|
Ответ: Помогите, вылетает Invalid Memory Acces
Еще кстати можно использовать GetLogicalDriveStrings_ для того чтобы не перебирать все возможные диски:
Define.s drives, root_name, volume_name, system_name
Define.l length, volume_serial, max_length, system_flags
Define.q free_bytes_avail, total_bytes, total_free_bytes
volume_name = Space(#MAX_PATH)
system_name = Space(#MAX_PATH)
drives = Space(#MAX_PATH)
length = GetLogicalDriveStrings_(#MAX_PATH, @drives) - 1
For i = 0 To length Step 4
Debug "Root name " + PeekS(@drives + i)
If (GetVolumeInformation_(@drives + i, @volume_name, #MAX_PATH, @volume_serial, @max_length, @system_flags, @system_name, #MAX_PATH))
Debug "Volume name " + volume_name
Debug "Serial " + Hex(volume_serial)
Debug "Flags " + Str(system_flags)
Debug "File system " + system_name
Else
Debug "Unavaliable"
EndIf
If (GetDiskFreeSpaceEx_(root_name, @free_bytes_avail, @total_bytes, @total_free_bytes))
Debug "Free bytes available " + Str(free_bytes_avail >> 20)
Debug "Total bytes " + Str(total_bytes >> 20)
Debug "Total free bytes " + Str(total_free_bytes >> 20)
EndIf
Debug "------------------"
Next
End
|
(Offline)
|
|
08.10.2008, 07:02
|
#4
|
ПроЭктировщик
Регистрация: 05.08.2006
Сообщений: 183
Написано 107 полезных сообщений (для 410 пользователей)
|
Re: Помогите, вылетает Invalid Memory Acces
Спасибо!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:07.
|