1

我的软件使用一个 DLL,它是由一个 INI 文件配置的。它获取第一个具有特定名称的名称(如果重要,则为 Bemafi32.ini),它可以在系统路径中找到。

我想在我的软件中添加编辑此文件的功能。如果我的系统有两个或多个同名文件(这是非常非常常见的),我不想弄错一个。我如何保证获得正确的文件?

4

2 回答 2

5

要找到路径上的第一个 INI 文件,然后使用另一个答案和。DLL 更有可能使用与自身位于同一目录中的 INI 文件,而不是路径上的第一个文件。否则, DLL 的所有副本将使用相同的INI 文件,因为所有进程的路径通常相同。FileSearchGetEnvironmentVariable

要在与 DLL 相同的目录中获取 INI 文件,您需要知道 DLL 在哪里,这可能需要知道您将加载哪个 DLL 副本。这不是最容易弄清楚的事情,因此您可以将负担转移到操作系统:

  1. 自己加载 DLL LoadLibrary。操作系统将使用其正常的搜索算法来查找 DLL。
  2. 调用GetModuleFileName以找出您加载的 DLL 的路径。
  3. 打开与 DLL 位于同一目录中的 INI 文件。

(如果您的程序已经加载了 DLL,因为它使用了 DLL,那么您可以调用GetModuleHandle而不是LoadLibrary.)

于 2013-04-24T20:35:40.420 回答
4

@user539484,我想你的评论可能是一个更好的答案......

没问题,我可以将其作为答案,但只有当您真正确定您的 DLL 的行为与您在问题中描述的完全一样时,这才是一个解决方案。请记住,DLL 搜索策略比仅在PATH.

var
  IniPathName: TFileName;
begin
  IniPathName := FileSearch('Bemafi32.ini', GetEnvironmentVariable('PATH')); { do not localize }
  Assert(IniPathName <> '', 'Unable to locate file');
  { ... }

参考:

于 2013-04-24T19:34:20.630 回答