Windows 10 资源管理器文件打开对话框:文件名在已编译的可执行文件中消失

Windows 10 Explorer file open dialog: filenames disappearing in compiled executable

我们有一个相当大的遗留 Python 应用程序,用 Python 2.7 64 位写在 Windows 10 64 位上 - 在 wxPython 中有 GUI,繁重的数值计算通过 NumPy,使用 MatPlotLib 进行 2D 绘图,使用 VTK 进行 3D 等等,在使用 Cython 将我们自己的所有 Python 文件转换为 pyd(Windows dll)后,我们将其作为 py2exe 编译二进制文件分发。

大约一个月前,我们开始在 Windows 上遇到文件打开对话框的超级奇怪行为 - 即,当用户要求从磁盘加载 model/file 时出现的对话框.问题是,所有文件名都不见了,我们只能看到 folders/files 的图标,根本看不到文字。

请看下图:

如您所见,通常包含图标和文件名的中央列表现在仅显示图标。取回文件名的唯一方法是 right-click 主 window 和 select“刷新”——尽管有时导航到不同的文件夹会使文件名显示出来。

此行为在使用 Python 代码时不会出现,仅在编译的应用程序中出现。其他软件不会发生这种情况(Microsoft Office、Notepad++,其他任何软件,它们都像我们的应用程序一样使用本机 Windows 文件对话框,它们都可以正常工作。

我已经和这个问题抗争了好几天了,可执行分发文件夹中有数百个 dll 和标准 Python 模块,并且 sub-folders 包含Python 标准库加上所有第 3 方库...这些 dll 和 Windows 本机 dll 之间可能的交互是不可数的。

我们也对 Windows 更新、何时何地以及如何进行零控制,并且在我们的机器被锁定为企业野兽时零访问权限。

现在,对于问题:

  1. 有没有人以前在应用程序中见过这种行为?如果是,您能否指出我们可能的解决方案?
  2. 如果以前没有人见过这个,您知道是否有办法通过任何必要的方式强制刷新打开的文件对话框 - 无论是 MFC 命令,还是 Python通过 win32gui、系统调用、C hack 等等?

预先感谢 hair-pulling 程序员同事。

编辑

经过一些痛苦之后,我发现 py2exe 包含了一个来自我机器的 Windows DLL (PROPSYS.dll),它与所有其他机器不兼容(它们具有各种体系结构) .从构建系统中排除该 DLL 已解决问题。

感谢@Simon Mourier 提出的查看进程使用的 DLL 的宝贵建议。谢谢!!!如果您 post 您的评论作为答案,我会接受它作为解决方案。

在 Windows 中,当应用程序以一种奇怪的方式失败时,一个想法是检查该应用程序进程中加载​​的 .dll 是什么,并尝试发现任何看起来奇怪的东西。

当您使用 Windows Shell 提供的公共对话框(打开、另存为)提供程序时尤其如此,因为这样做可能会引入很多第 3 方 .dll,加载它们正在处理中。

最好的检查工具之一是 Process Explorer from Sysinternals.

这是一个屏幕截图,显示了在标准记事本中打开的外部 .dll 只是因为我使用了“文件打开”对话框。我们可以看到Intel的扩展,Adobe的扩展,OneDrive等等

这不是这里的问题,但它显然有助于发现问题。