在64位Windows 7机器上使用Python构建Com服务器

3 投票
1 回答
3606 浏览
提问于 2025-04-16 09:20

原帖链接在这里: http://mail.python.org/pipermail/python-win32/2010-December/011011.html

我正在使用:

  • 操作系统:64位 Windows 7 专业版
  • Python:python-2.7.1.amd64
  • Python win32 扩展: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 创建的 COM 服务器,用于图标叠加,它在 "C:\icons" 文件夹上添加了一个勾选标记的叠加图标(C:\icons\test.ico)。

  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:\ 目录下。

当我在 Windows 命令提示符下执行 python test_icon_overlay.py 并重启 explorer.exe 时,图标叠加会出现在 C:\icons 文件夹上。但用 setup_VI.py 创建的 dll 文件却不行。

我使用 python setup_VI.py py2exe 创建了 dll 文件,然后尝试用 regsvr32 test_icon_overlay.dll 注册它。注册失败,出现了 Windows 错误信息 Error 0x80040201 while registering shell extension

然后我在 Python27/Lib/site-packages/py2exe/boot_com_servers.py 中打开了日志记录,这里是我在 regsvr32 test_icon_overlay.dll 时在 comerror.txt 中得到的错误信息:

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) 或者在 64 位 Windows 7 上构建的 dll 有问题。

另外,我看到在 64 位 Windows 7 上安装 pywin32-214.win-amd64-py2.7 时也出现了错误信息:快照

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

我是不是做错了什么?对此任何帮助都非常感谢。

1 个回答

5

在64位的Python中,py2exe有个bug。py2exe初始化的sys.frozendllhandle是无效的,这导致win32api.GetModuleFileName(sys.frozendllhandle)这个函数调用失败。

你可以试试这个修复过的py2exe安装包,链接在这里:http://www.lfd.uci.edu/~gohlke/pythonlibs/#py2exe

撰写回答