问题描述
我们有一个相当大的,在Windows 10 64位上使用Python 2.7 64位编写的旧Python应用程序-在wxPython中具有GUI,通过NumPy进行大量数值计算,使用MatPlotLib进行2D绘制,使用VTK进行3D绘制等,我们将它们分发为使用Cython将我们所有的Python文件转换为pyd(Windows dll)后,py2exe会编译二进制文件。
大约一个月前,我们开始在Windows上遇到超级奇怪的文件打开对话框行为-即,当用户要求从磁盘加载模型/文件时出现的对话框。问题是,所有文件名都消失了,我们只能看到文件夹/文件的图标,根本没有文本。
请参见下图:
如您所见,通常包含图标和文件名的中央列表现在仅显示图标。取回文件名的唯一方法是右键单击主窗口,然后选择“刷新”-尽管有时导航到其他文件夹会使文件名显示出来。
仅在编译的应用程序中,使用Python代码时不会显示此行为。而其他软件(Microsoft Office,Notepad ++等)则不会发生这种情况,它们都使用本机Windows文件对话框(例如我们的应用程序,它们都可以正常工作)。
我已经为此奋斗了好几天,但由于可执行文件分发文件夹中包含数百个dll和标准python模块以及包含Python标准库和所有第三方库的子文件夹,因此发生的情况并不太明显...这些dll和Windows本机dll之间可能发生的交互是无法计数的。
我们还对Windows更新,何时何地以及何时以及如何进行零控制,并在机器锁定公司野兽时对我们的计算机进行零访问特权。
现在,对于以下问题:
- 有人在应用程序中见过这种行为吗?如果是,您能否指出我们可能的解决方案?
- 如果以前没有人看到过这种情况,您是否知道是否有一种方法可以通过必要的方式强制刷新打开的文件对话框-无论是MFC命令,通过win32gui的Python命令,系统调用,是C hack吗?
预先感谢拉头发的程序员。
编辑
经过一番痛苦之后,我发现py2exe包含了我机器上的Windows DLL(PROPSYS.dll),该DLL与所有其他机器(它们具有各种体系结构)都不兼容。从生成系统中排除该DLL可以解决此问题。
感谢@Simon Mourier提供了宝贵的建议,以了解该进程使用的DLL。谢谢!!!如果您发表评论作为答案,我会接受它作为解决方案。
解决方法
在Windows中,当应用程序以奇怪的方式失败时,一个想法是检查该应用程序的进程中加载了什么.dll,并尝试发现任何看起来很奇怪的东西。
当您使用Windows Shell提供的“通用对话框”(打开,另存为)提供程序时,尤其如此,因为这样做可能会引入很多第三方.dll,并在过程中加载它们。
最好的检查工具之一是Process Explorer from Sysinternals.
这是一个截图,显示了在标准记事本中打开的外部.dll的原因,只是因为我使用了“文件打开”对话框。我们可以看到Intel的扩展,Adobe扩展,OneDrive等。
这不是问题所在,但显然,它可以帮助发现问题。