如何防止本地 msmpi 安装加载系统范围的 msmpi.dll

Posted

技术标签:

【中文标题】如何防止本地 msmpi 安装加载系统范围的 msmpi.dll【英文标题】:How to prevent local msmpi installation from loading system wide msmpi.dll 【发布时间】:2021-07-09 11:53:58 【问题描述】:

我正在编写一个用于设置环境并使用 msmpi mpiexec.exe 启动(打开)各种 hpc 应用程序的 Windows 控制台应用程序。

我在本地安装了一个 msmpi 安装到我正在编写的应用程序。一切正常,并行处理正常。

但是,一旦我碰巧也安装了 msmpi (例如由 msmpisetup.exe 安装),我的应用程序就会顽固地加载 Windows/system32/msmpi.dll 而不是我使用 PATH 指出的 msmpi.dll。由于系统 msmpi.dll 版本不同,我的应用程序无法运行。

PATH env.var。是在我的应用程序中设置的,它显然是由子进程正确继承的,包括 mpiexec

我发现的唯一补救方法是 (1) 重命名 system32/msmpi.dll 或 (2) 放置“我的”msmpi.dll 的副本进入我有一个并行可执行文件的每个文件夹。两种疗法都……不好。

如何防止我的应用选择 system32/msmpi.dll 并改用 PATH 中的实例??

感谢您的建议。

没有

【问题讨论】:

【参考方案1】:

Windows 中标准的 DLL 搜索顺序是documented 是

    加载应用程序的目录。 系统目录。使用GetSystemDirectory函数获取该目录的路径。 16 位系统目录。没有函数获取这个目录的路径,但是搜索到了。 Windows 目录。使用 GetWindowsDirectory 函数获取该目录的路径。 当前目录。 PATH 环境变量中列出的目录。 请注意,这不包括由 App Paths 注册表项指定的每个应用程序的路径。计算 DLL 搜索路径时不使用 App Paths 键。

如果您希望您的应用程序在使用系统位置之前先检查特定位置,您可以在 应用程序中调用 SetDllDirectory,然后让它执行需要特定 DLL 的其他二进制文件。

【讨论】:

以上是关于如何防止本地 msmpi 安装加载系统范围的 msmpi.dll的主要内容,如果未能解决你的问题,请参考以下文章

MS MPI 不执行 MPI 程序

MS MPI 没有包含的文件夹

WP8.1程序开发中,如何加载本地文件资源或安装在程序包中的资源。

如何防止本地插件在 Wordpress 上加载?

如何防止 MS Access 连接模式和表名,从而使它们超过 64 个字符的限制?

仅限 MS Windows:需要一种在进程范围内创建私有文件系统的方法