前两天觉得好玩,就用Python的Kivy库写了个生命模拟的小程序,可今天竟莫名奇妙地不能运行了,一运行就提示无法在 libpng16-16.dll 中定位 inflateReset2 函数,上网搜也只是说 libpng16-16.dll 或是 zlib1.dll 有问题,需要替换掉,可我之前都运行很好啊,至少Python目录下的文件是没问题的,这几天我并没有更新Python的任何东西,这个问题真是令人不解。
不过通过网上搜索,至少知道了 inflateReset2 是在 zlib1.dll 中的,Kivy是通过 libpng16-16.dll 间接引用了这个函数,所以它的错误提示实际是说 zlib1.dll 中没有这个函数。于是我用 depends 查看了一下Python目录下的 zlib1.dll,发现它是含有 inflateReset2 的,这真是奇了怪了……
后来上网搜到有人也有类似的问题,有人回答说很可能是某个程序改变了系统环境的搜索路径,覆盖了Python的路径,但是我把Python中包含 zlib1.dll 的目录作为搜索路径的第一条也还是出现同样的问题。但这个回答提醒了我,我去 C:\Windows\System32 下果然看到了 zlib1.dll 文件,但这个文件的大小比Python中的小很多,可见这个是个很旧的版本,一看这个文件的创建时间,竟是今天!也就是说,这个旧版的 zlib1.dll 并不是系统自带的,而是今天我装软件的时候给装上的,而这个创建时间恰好同我装工行网银助手的时间一致,原来这个“有问题”的 zlib1.dll 是工行网银助手给装上的!把 zlib1.dll 删去以后,我的Python小程序果然能正常运行了……这个网银助手真是令人蛋疼,你说你如果需要这个dll文件,完全可以把它放到你自己的安装目录下,根本没必要放到系统目录下,这不是给其他程序添乱嘛……
通过这个“事件”,至少让我得到了两点教训:
- C:\Windows\System32 这个目录非常重要,在应用程序链接dll时,会优先考虑 C:\Windows\System32 下的,不管系统的path环境变量如何设置;
- 小心国产软件,国产软件往往缺乏“君子之道”,总是往系统添加各种自己的“私货”,能不装就不装。要使用国产软件,最好从Microsoft Store中安装,至少这里面的软件是被系统严格限制权限的。
打算重装系统了,因为不知道国产软件还对系统做了什么“手脚”,这次要杜绝一切非Microsoft Store中的国产软件!