Сборка Com-сервера с использованием Python на 64-битной машине Windows 7

Исходное сообщение находится здесь: http://mail.python.org/pipermail/python-win32/2010-December/011011.html

Я использую:

  • ОС: 64-битная Windows 7 Профессиональная
  • Питон: python-2.7.1.amd64
  • Расширения Win32 Python: pywin32-214.win-amd64-py2.7
  • Py2exe: py2exe-0.6.9.win64-py2.7.amd64

Я пытаюсь создать наложение значков для Windows. На 32-битной Windows все работало, а на 64-битной Windows 7 не работало.

Вот модули Python, которые я создал для тестирования:

  1. test_icon_overlay.py: ( http://mail.python.org/pipermail/python-win32/attachments/20101229/bb8c78a4/attachment-0002.obj ), созданный в Python для наложения значков, который добавляет значок наложения галочки (C:\icons\test.ico) в папке "C:\icons"

  2. setup_VI.py: ( http://mail.python.org/pipermail/python-win32/attachments/20101229/bb8c78a4/attachment-0003.obj ), который создает test_icon_overlay.dll для распространения.

  3. icons.zip: ( http://mail.python.org/pipermail/python-win32/attachments/20101229/bb8c78a4/attachment-0001.zip ) для тестирования вы должны извлечь icons.zip внутрь C:\

Наложение значка появляется в папке C:\icons, когда я запускаю python test_icon_overlay.py в командной строке Windows и перезапускаю explorer.exe. Но он не работает с файлом dll, созданным с помощью setup_VI.py

Я создал файл dll с помощью python setup_VI.py py2exe, а затем попытался зарегистрировать его с помощью regsvr32 test_icon_overlay.dll. Ошибка регистрации с сообщением об ошибке Windows Error 0x80040201 while registering shell extension.

Затем я включил регистратор в Python27/Lib/site-packages/py2exe/boot_com_servers.py, и вот трассировка, которую я получаю в comerror.txt на regsvr32 test_icon_overlay.dll

PATH is ['C:\\root\\avalon\\module\\sync\\python\\src\\dist\\library.zip']
Traceback (most recent call last):
  File "boot_com_servers.py", line 37, in <module>
pywintypes.error: (126, 'GetModuleFileName', 'The specified module could not
be found.')
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'DllRegisterServer' is not defined

Похоже, может быть проблема с win32api.GetModuleFileName(sys.frozendllhandle) или со сборкой dll на 64-битной Windows 7.

Кроме того, я видел, что установка pywin32-214.win-amd64-py2.7 в 64-разрядной версии Windows 7 завершается с сообщением об ошибке: Снимок

close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr

Есть ли что-то, что я делаю неправильно? Любая помощь в этом высоко ценится.


person Vijayendra Bapte    schedule 03.01.2011    source источник
comment
Когда вы говорите, что это работает в 32-битной Windows, это 32-битная Windows 7 или более старая версия, такая как Windows XP? Если вы не пробовали 32-битную версию той же ОС, где 64-битная не работает, проблема может быть вовсе не в 64-битности. Например, если он работает в XP, но не в Win7, это может быть связано с UAC.   -  person Leo Davidson    schedule 03.01.2011
comment
Я протестировал dll, созданный в 32-разрядной версии Windows XP, на 32-разрядных версиях Windows XP, Vista и Win7, и наложение значков отлично работает в каждой ОС. Но 64-битная dll, сгенерированная на 64-битной Windows XP/Win7, вообще не работала на 64-битной машине XP/Win7. Ошибка регистрации dll на 64-битной машине.   -  person Vijayendra Bapte    schedule 03.01.2011
comment
Возможно глупый вопрос, но при выполнении regsvr32 окно cmd запускается с правами администратора, верно?   -  person Mark    schedule 03.01.2011
comment
Я попробовал Win7 с использованием учетной записи администратора, и командная строка была вызвана с правами администратора.   -  person Vijayendra Bapte    schedule 04.01.2011
comment
Здесь есть немного более простая установка с той же проблемой: windows-7" title="python 64-битная проблема с регистрацией dll com-сервера на 64-битных Windows 7"> stackoverflow.com/questions/4619701/   -  person Heikki Toivonen    schedule 07.01.2011
comment
Похоже, что test_icon_overlay.exe /reg успешно регистрирует это, но я не уверен, правильно ли он поступает. Возможно обходной путь...   -  person Heikki Toivonen    schedule 07.01.2011


Ответы (1)


В py2exe на 64-битном Python есть ошибка. sys.frzendllhandle, инициализированный py2exe, является недопустимым, так что win32api.GetModuleFileName(sys.frzendllhandle) не работает.

Вы можете попробовать исправленные установщики py2exe на http://www.lfd.uci.edu/~gohlke/pythonlibs/#py2exe

person cgohlke    schedule 06.01.2011
comment
Где я могу увидеть актуальный патч для py2exe? - person Heikki Toivonen; 07.01.2011
comment
Я отправил исправление на sourceforge.net/tracker/ - person cgohlke; 07.01.2011