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

Или имелись в виду out параметры? Если да - то это особенность С как языка. Везде так делают.
Smar
Немного дожеванный вариант
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 вернула пустую стоку. Вот такие пироги с котятами…
Андрей Светлов
Если для диска нет метки - будет пустая строка.
Скобочки не стоит окружать пробелами: POINTER( DWORD ) => POINTER(DWORD)
Глаза режет. Существует вполне адекватный PEP-8
Smar
Андрей Светлов
Скобочки не стоит окружать пробелами: POINTER( DWORD ) => POINTER(DWORD)
Исправил.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB