Форум сайта python.su
Суть проблемы. Есть прога которая для защиты использует данные из win32api.GetVolumeInformation. Была сделана на Python2.5. “Компилирована” с помощью py2exe. Недавно перешли на 2.6. Плюс система ХР -> Win7. Возникли проблемы при попытке перекомпилировать под 2.6. Выяснилось что win32api не каким образом не хочет вставать в экзешник. Такое впячетление , что py2exe его просто не видит. Причем на чистом питоне программа работает на ура. В общем это не все проблемы с переходом, но эта пожалуй самая навязчивая. Как можно еще достать эту информацию? Пробовал ctypes, но не могу разобраться. В С признаться чайник со свистком. ;) Прошу помощи
Офлайн
В общем нашел решение с помощью 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
Офлайн
SmarА явно прописывать пробывали?
Выяснилось что win32api не каким образом не хочет вставать в экзешник. Такое впячетление , что py2exe его просто не видит.
setup(
...
options={
'py2exe':{
'packages': ["win32api"],
...
}
},
...
)
Офлайн
PooHПробовал. Не помогло.
А явно прописывать пробывали?
Офлайн
Для проверки, попробуй собрать проект другим ‘компилятором’
Win7, Python 2.6.4, cx_Freeze: Модуль win32api импортируется и исправно работает.
Офлайн
Что-то подсказывает мне, что проблема совсем не py2exe и не в pywin32
Попробуйте установить на ПК runtime библиотеки от 2005 и 2008 студии, и переустановить pywin32, проблемы скорее всего исчезнут :)
Офлайн
И все же win32all - гадость. Я его долго выкусывал из проекта, заменяя на ctypes.
Потому что были определенные трудности со сборкой standalone distribution. Использовал самопальный сборщик/запускатор, который работал примерно так же, как и py2exe.
Описаной проблемы не видел - мне хватило того, что win32all расползается по site-packages как ему левая нога Хаммонда подсказывает. В результате приходилось делать упаковщик всех библиотек - и отдельный специально для win32all. Один раз сделал, во второй - сменил библиотеку. К тому же мне ctypes больше нравятся.
Офлайн
Честно говоря мне ctypes тоже начинается нравиться. Только бы разобраться в нем. Может кто нибудь подскажет инфу по нему (слабо надеясь) на русском =)
Или хотя бы для начала как вытащить информацию из функции длл.
from ctypes import *
dll1 = windll.kernel32
print dll1
print dll1.GetVolumeInformationW
pyuserPython 2.6 для винды откомпилирован с помощью VC 2008, соответственно runtime от 2005 в принципе не поможет, а для VC 2008 у меня стоит. Скорее всего модуль все-таки пока не поддерживает Win7. Последнее обновление модуля - май 2009. Система вышла в октябре. В api Win7 есть ряд изменений, которые явно не учтены в модуле.
Что-то подсказывает мне, что проблема совсем не py2exe и не в pywin32
Попробуйте установить на ПК runtime библиотеки от 2005 и 2008 студии, и переустановить pywin32, проблемы скорее всего исчезнут smile
win32all - гадость.
Офлайн
Дока по ctypes на русском не поможет:) Нужно читать msdn
Ссылка на документацию по GetVolumeInformation - http://msdn.microsoft.com/en-us/library/aa364993(VS.85).aspx
Создаем прокси-функцию:
import ctypes
GetVolumeInformation = windll.kernel32.GetVolumeInformationW
from ctypes.wintypes import *
LPDWORD = ctypes.POINTER(DWORD)
GetVolumeInformation.restype = BOOL
GetVolumeInformation.argtypes = LPWSTR, LPWSTR, DWORD, LPDWORD, LPDWORD, LPDWORD, LPWSTR, DWORD
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'
Отредактировано (Дек. 18, 2009 20:24:12)
Офлайн
Андрей Светлов спасибо огромное. На самом деле информацию по GetVolumeInformation уже два вечера пытался прожевать. “Я уж к ней и так и эдак со словами и …”. А тут все ясно и понятно. Все разжевано и в рот положено. Осталось только проглотить. Теперь боле мене понятно как работать с длл.
Хотя один маленький вопрос остался:
Объявление в функции одновременно и вводимых и выводимых данных- это общий подход в С или вариации мелко-мягких?
Заранее извеняюсь за ламерский вопрос. Если не трудно. Просто интересно
Офлайн