Форум сайта python.su
Это лучше всегда делать в ctypes. Если забивать - иногда прокатывает. Но можно легко поймать неожиданность.
Поэтому - всегда рекомендую.
Технически дело выглядит так: без объявления ctypes не делает проверки на типы. Если подсунуть неправильный параметр - будет непредсказуемый результат. Вплоть до краша. Объявления добавляют надежность - но полной гарантии не дают.
Или имелись в виду out параметры? Если да - то это особенность С как языка. Везде так делают.
Отредактировано (Дек. 19, 2009 00:41:28)
Офлайн
Немного дожеванный вариант
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
Отредактировано (Дек. 20, 2009 09:55:11)
Офлайн
Если для диска нет метки - будет пустая строка.
Скобочки не стоит окружать пробелами: POINTER( DWORD ) => POINTER(DWORD)
Глаза режет. Существует вполне адекватный PEP-8
Офлайн
Андрей СветловИсправил.
Скобочки не стоит окружать пробелами: POINTER( DWORD ) => POINTER(DWORD)
Офлайн