用 Python写Winform程序,使用 wxPython做界面,用 py2exe编译成exe,由于使用到了ActiveX控件,导致编译出的exe程序不能运行,并且提示以下错误:
Runtime Error!
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
google一番之后在 这里发现跟我类似的情况。其中说到,有些DLL被打包进一个exe后不能正常工作,需要使用将setup.py文件中的boundle_file设置为3。我按照说明把boundle_file设置为3重新编译,再运行虽然不出上面错误,但却不能显示主窗口。
在后来的回帖中作者提到在setup.py中加入下面的语句:
'typelibs' : [('{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}', 0, 1, 1)]
一开始也不明白这个语句加在什么地方,于是就想到看看py2exe的有没有类似的例子,还真有!在D:\Python25\Lib\site-packages\py2exe\samples\pywin32\com_typelib\build_gen\word(我把Python安装在了D盘)目录下,打开setup.py发现这样一条注释:
#'win32com/client/makepy.py -i' to find a typelib
隐约觉得这里可能有我要找的信息,于是在命令提示符下运行如下命令:
d:\Python25\Lib\site-packages\win32com\client\makepy.py -i
该命令会弹出一个小窗口,在其中找到引用的ActiveX控件,然后确定,会输出一些该控件的信息,其中包括该控件的LIBID,lcid,major和minor值,用这些信息替换到上述语句中的相应值,再重新编译,程序终于可以正常运行了!
示例是一个用Adobe Acrobat 7.0 ActiveX Control打开PDF文件的程序,试验环境是:
Windows2003Python 2.5
wxPython 2.8
py2exe-0.6.9.win32-py2.5
pywin32-212.win32-py2.5