Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 18, 2009 21:59:10

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Замена win32api.GetVolumeInformation ?

Это лучше всегда делать в ctypes. Если забивать - иногда прокатывает. Но можно легко поймать неожиданность.
Поэтому - всегда рекомендую.
Технически дело выглядит так: без объявления ctypes не делает проверки на типы. Если подсунуть неправильный параметр - будет непредсказуемый результат. Вплоть до краша. Объявления добавляют надежность - но полной гарантии не дают.

Или имелись в виду out параметры? Если да - то это особенность С как языка. Везде так делают.



Отредактировано (Дек. 19, 2009 00:41:28)

Офлайн

#2 Дек. 19, 2009 14:12:08

Smar
От:
Зарегистрирован: 2007-11-18
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена win32api.GetVolumeInformation ?

Немного дожеванный вариант

from ctypes import *
from ctypes.wintypes import *

GetVolumeInformation = windll.kernel32.GetVolumeInformationW
LPDWORD = POINTER(DWORD)
GetVolumeInformation.restype = BOOL
GetVolumeInformation.argtypes = LPWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD
volumeNameBuffer = create_unicode_buffer(1024)
volumeSerialNumber = DWORD()
maximumComponentLenght = DWORD()
fileSystemFlags = DWORD()
fileSystemNameBuffer = create_unicode_buffer(1024)
ret = GetVolumeInformation(u'c:\\', volumeNameBuffer, 1024, byref(volumeSerialNumber), byref(maximumComponentLenght), byref(fileSystemFlags), fileSystemNameBuffer, 1024)
if ret:
print volumeSerialNumber.value
print volumeNameBuffer.value
print maximumComponentLenght.value
print fileSystemNameBuffer.value
Возвращаемые данные (система Win7):
4030854902

255
NTFS

Интересно , что volumeNameBuffer.value вернула пустую стоку. Вот такие пироги с котятами…



Отредактировано (Дек. 20, 2009 09:55:11)

Офлайн

#3 Дек. 19, 2009 15:56:34

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Замена win32api.GetVolumeInformation ?

Если для диска нет метки - будет пустая строка.
Скобочки не стоит окружать пробелами: POINTER( DWORD ) => POINTER(DWORD)
Глаза режет. Существует вполне адекватный PEP-8



Офлайн

#4 Дек. 20, 2009 09:56:27

Smar
От:
Зарегистрирован: 2007-11-18
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Замена win32api.GetVolumeInformation ?

Андрей Светлов
Скобочки не стоит окружать пробелами: POINTER( DWORD ) => POINTER(DWORD)
Исправил.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version