python - Windows 10 资源管理器文件打开对话框 : filenames disappearing in compiled executable

标签 python winapi wxpython explorer openfiledialog

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

大约一个月前,我们开始遇到 Windows 上文件打开对话框的一种 super 奇怪的行为 - 即当用户要求从磁盘加载模型/文件时出现的对话框。问题是,所有文件名都消失了,我们只能看到文件夹/文件的图标,根本看不到任何文本。

请看下图:

enter image description here

如您所见,通常包含图标和文件名的中央列表现在仅显示图标。恢复文件名的唯一方法是在主窗口中右键单击并选择“刷新” - 尽管有时导航到不同的文件夹会使文件名显示出来。

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

我已经为此奋斗了好几天,而且发生的情况并不明显,因为可执行分发文件夹有数百个 dll 和标准 Python 模块以及包含 Python 标准库和所有第三方库的子文件夹...这些 dll 和 Windows native dll 之间可能的交互是无数的。

我们还对 Windows 更新的时间、地点和方式进行零控制,并对我们的计算机实行零访问权限,因为它们被锁定为公司的野兽。

现在,回答问题:

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

提前感谢一位令人烦恼的程序员同事。

编辑

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

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

最佳答案

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

当您通过 Windows Shell 使用通用对话框(打开、另存为)提供程序时尤其如此,因为这样做可能会引入大量第三方 .dll,并在此过程中加载它们。

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

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

enter image description here

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

关于python - Windows 10 资源管理器文件打开对话框 : filenames disappearing in compiled executable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64144059/

相关文章:

python - Firefox WebDriver 实例不是使用 selenium python 绑定(bind)创建的

python - 需要帮助使用 python 生成 PDF 或 Doc 格式的报告

c - 如何在Windows中随时(同时)发送数据?

python - wxpython 面板大小和标题

python - 用python绘制关系矩阵

python - 如何在 Travis CI 上构建 MacOSX 可执行文件?

python - 重定向通过python执行的shell脚本的输出

python - kivy 的 export_to_png() 函数给出错误

c++ - 对 WriteFile 的异步调用会导致写入中断吗?

c++ - 如何让 EnumWindows 列出所有窗口?