Найти - Пользователи
Полная версия: Замена win32api.GetVolumeInformation ?
Начало » Python для новичков » Замена win32api.GetVolumeInformation ?
1 2
Smar
Суть проблемы. Есть прога которая для защиты использует данные из win32api.GetVolumeInformation. Была сделана на Python2.5. “Компилирована” с помощью py2exe. Недавно перешли на 2.6. Плюс система ХР -> Win7. Возникли проблемы при попытке перекомпилировать под 2.6. Выяснилось что win32api не каким образом не хочет вставать в экзешник. Такое впячетление , что py2exe его просто не видит. Причем на чистом питоне программа работает на ура. В общем это не все проблемы с переходом, но эта пожалуй самая навязчивая. Как можно еще достать эту информацию? Пробовал ctypes, но не могу разобраться. В С признаться чайник со свистком. ;) Прошу помощи
Smar
В общем нашел решение с помощью comtypes. Примерно такое
from ctypes import POINTER
from comtypes.client import CoGetObject
wmi = CoGetObject( "winmgmts:" )
disks = wmi.InstancesOf( "Win32_LogicalDisk" )
from comtypes.gen import WbemScripting
WbemScripting.wbemPrivilegeCreateToken

for item in disks:
if item.Properties_["Caption"].Value == u'C:':
print item.Properties_['VolumeSerialNumber'].Value
Но не нравится мне цикл. Не знаю как от него избавиться. Не подскажете?
PooH
Smar
Выяснилось что win32api не каким образом не хочет вставать в экзешник. Такое впячетление , что py2exe его просто не видит.
А явно прописывать пробывали?
setup(
...
options={
'py2exe':{
'packages': ["win32api"],
...
}
},
...
)
Smar
PooH
А явно прописывать пробывали?
Пробовал. Не помогло.
Вот отрывок лога:
File “bd.pyc”, line 320, in CreateBd
ImportError: MemoryLoadLibrary failed loading win32api.pyd

Выяснил на сайте PyWin32 при установке на семерку модуля выдается RunTimeError. По началу не придал значения. Особо не мешал. В чистом питоне работает. Видимо зря. Вообще в последнее время модуль приносит весьма неприятные сюрпризы. Был случай когда практически готовую прогу пришлось срочно возвращать на доработку. Причем на тестовых компах прога работала, а на компе заказчика отказалась напрочь. Заглючил модуль win32com. Пришлось срочно искать замену. В итоге перешли на comtypes. По моему он работает более стабильно. Но тогда разобрались только с подключением к Ворду.

Кстати, пробовал установить PyWin32 с сырца- Выдает ошибку.
Slon
Для проверки, попробуй собрать проект другим ‘компилятором’

Win7, Python 2.6.4, cx_Freeze: Модуль win32api импортируется и исправно работает.
pyuser
Что-то подсказывает мне, что проблема совсем не py2exe и не в pywin32
Попробуйте установить на ПК runtime библиотеки от 2005 и 2008 студии, и переустановить pywin32, проблемы скорее всего исчезнут :)
Андрей Светлов
И все же win32all - гадость. Я его долго выкусывал из проекта, заменяя на ctypes.
Потому что были определенные трудности со сборкой standalone distribution. Использовал самопальный сборщик/запускатор, который работал примерно так же, как и py2exe.
Описаной проблемы не видел - мне хватило того, что win32all расползается по site-packages как ему левая нога Хаммонда подсказывает. В результате приходилось делать упаковщик всех библиотек - и отдельный специально для win32all. Один раз сделал, во второй - сменил библиотеку. К тому же мне ctypes больше нравятся.
Smar
Честно говоря мне ctypes тоже начинается нравиться. Только бы разобраться в нем. Может кто нибудь подскажет инфу по нему (слабо надеясь) на русском =)
Или хотя бы для начала как вытащить информацию из функции длл.
from ctypes import *
dll1 = windll.kernel32
print dll1
print dll1.GetVolumeInformationW
В общем функция присутствует. А что дальше? Не могу понять.

pyuser
Что-то подсказывает мне, что проблема совсем не py2exe и не в pywin32
Попробуйте установить на ПК runtime библиотеки от 2005 и 2008 студии, и переустановить pywin32, проблемы скорее всего исчезнут smile
Python 2.6 для винды откомпилирован с помощью VC 2008, соответственно runtime от 2005 в принципе не поможет, а для VC 2008 у меня стоит. Скорее всего модуль все-таки пока не поддерживает Win7. Последнее обновление модуля - май 2009. Система вышла в октябре. В api Win7 есть ряд изменений, которые явно не учтены в модуле.
Но в основном
win32all - гадость.
Андрей Светлов
Дока по ctypes на русском не поможет:) Нужно читать msdn
Ссылка на документацию по GetVolumeInformation - http://msdn.microsoft.com/en-us/library/aa364993(VS.85).aspx
Создаем прокси-функцию:
import ctypes
GetVolumeInformation = windll.kernel32.GetVolumeInformationW
Теперь нужно рассказать, что функция принимает и что возвращает. По умолчанию - все int, но msdn говорит другое
from ctypes.wintypes import *
LPDWORD = ctypes.POINTER(DWORD)
GetVolumeInformation.restype = BOOL
GetVolumeInformation.argtypes = LPWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD
Заводим переменные для возвращаемых значений. Для указателей есть byref. Строки в Питоне неизменяемые, поэтому применяем create_unicode_buffer
byref = ctypes.byref
volumeNameBuffer = ctypes.create_unicode_buffer(1024)
volumeSerialNumber = DWORD()
maximumComponentLenght = DWORD()
fileSystemFlags = DWORD()
fileSystemNameBuffer = ctypes.create_unicode_buffer(1024)
Теперь осталось только вызвать
ret = GetVolumeInformation(u'c:\\', volumeNameBuffer, 1024, byref(volumeSerialNumber), byref(maximumComponentLenght), byref(fileSystemFlags),fileSystemNameBuffer, 1024)
У меня получилось:
>>> ret
1
>>> volumeNameBuffer.value
u'VistaOS'
>>> volumeSerialNumber.value
3233505920L
>>> maximumComponentLenght.value
255L
>>> fileSystemFlags.value
2556159L
>>> fileSystemNameBuffer.value
u'NTFS'
Вот и все. Бывает, нужно описать структуру через ctypes.Structure или сделать еще какое телодвижение - но это на самом деле элементарно.
Smar
Андрей Светлов спасибо огромное. На самом деле информацию по GetVolumeInformation уже два вечера пытался прожевать. “Я уж к ней и так и эдак со словами и …”. А тут все ясно и понятно. Все разжевано и в рот положено. Осталось только проглотить. Теперь боле мене понятно как работать с длл.
Хотя один маленький вопрос остался:
Объявление в функции одновременно и вводимых и выводимых данных- это общий подход в С или вариации мелко-мягких?
Заранее извеняюсь за ламерский вопрос. Если не трудно. Просто интересно
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