我正在使用Pyinstaller为用户创建Windows独立应用程序(-onefile
选项)(即,没有安装,用户双击应用程序并运行它)。它已经完全有效,DLL正在被发现等等。但是,我注意到我的应用程序试图从启动应用程序的文件夹中加载DLL。这是一个安全风险,因为许多用户将从他们的“下载”文件夹运行我的应用程序,因为它是一个独立的可下载文件。
在这些危险位置搜索的DLL是系统DLL,如bcrypt.dll,secur32.dll,iertutil.dll,sspicli.dll等。这些DLL最终在System32文件夹中找到,它只是那个它首先搜索应用程序启动的目录。在Pyinstaller创建的特殊_MEIXXXX文件夹中,第一次尝试正确找到特定于Python的DLL和与wxPython相关的DLL。其他系统DLL(如kernel32.dll和user32.dll)立即位于C:\ Windows \ System32
中我已经阅读了Windows上的DLL搜索顺序,我怀疑这是因为这些DLL是依赖DLL,因此首先在应用程序启动的目录中搜索。根据PyInstaller如何使用-onefile
选项,AppData中的_MEIXXXX文件夹应该是应用程序启动的目录。但似乎对于这些依赖的DLL,引导加载程序的起始目录是应用程序启动的目录,并成为DLL的第一个搜索路径。
我尝试了这些不同的解决方案:
1) SetDefaultDllDirectories
- 使用LOAD_LIBRARY_SEARCH_SYSTEM32
调用它似乎对我的应用程序加载的DLL加载的相关DLL没有任何作用。
2)应用程序清单与并排程序集 - 这实际上工作但非常难看,当所有DLL都被打包时,我的应用程序大小增加了10 MB。它也不是可移植的我需要我的应用程序才能在所有版本的Windows 7及更高版本上运行。绝对宁愿不必这样做。
3) Using the App Paths Registry key - 与1相同,它似乎没有为依赖DLL做任何事情。
我的问题是,是否真的有办法完全控制PyInstaller创建的应用程序的DLL加载行为?并且有没有人成功地这样做而不诉诸清单并将一堆系统DLL与他们的应用程序捆绑在一起?