【问题标题】:What is the purpose of GetPrivateProfileString? [closed]GetPrivateProfileString 的目的是什么? [关闭]
【发布时间】:2013-11-12 21:35:38
【问题描述】:

我在 C++ 程序中遇到了 GetPrivateProfileString 一词。谁能给我简单解释一下这个函数的使用方法?

我页面上的代码是:

GetPrivateProfileString("files", "directory", "/mediadb/files/", directory, os.path.getsize(directory), "apache")

【问题讨论】:

  • 所有关闭此问题的人都误解了问题的范围。这与随机代码库中的函数无关。这个函数是一个 Microsoft Windows API,与下面的论点相反,这个 API 在很多遗留代码中都存在。所以,这个问题其实以后很可能会有访客。
  • 是的。拥有一个庞大的客户群,他们决定阅读 *.ini 文件是要走的路,并且必须每天都在这段代码中苦苦挣扎。

标签: c++ windows winapi function


【解决方案1】:

GetPrivateProfileString() 从 .ini 文件中读取值。

在 16 位 Windows 时代,这是读取和写入应用程序配置数据的方式。那时,应用程序将其配置存储在一个共享的 .ini 文件中,该文件位于系统目录中,称为 win.ini。糟糕的时代!

要从 win.ini 读取,您调用了 GetProfileString()GetPrivateProfileString() 中的私有表示这样一个事实,即这个奇妙的功能允许您访问除 win.ini 之外的 .ini 文件,即您的应用程序私有的文件。如果我没记错的话(而且我的记忆很模糊),大多数应用程序在 win.ini 被官方不赞成这样做之后继续使用多年。

碰巧GetPrivateProfileString() 是一个令人难以置信的皱巴巴的野兽,具有糟糕的性能特征和难以理解的古怪之处。我个人像瘟疫一样避免它,如果我必须处理 .ini 文件,我会使用定制代码来处理。

Raymond Chen 有一个很好的 article 说明为什么不推荐使用 .ini 文件以支持注册表。

【讨论】:

  • +1 不仅仅是从 MSDN 复制粘贴。但我认为GetPrivateProfileString() 实际上是从应用程序的私有 .ini 文件中读取的。您所说的从通用 Win.ini 文件中读取的文件是 GetProfileString()
  • @Praetorian 谢谢。我的记忆很模糊。那是很久以前!我已经更新了答案,希望它更准确。
  • +1 非常感谢您的时间和耐心@David Heffernan!
  • 我不同意该功能仅仅是 16 位 Windows 的遗物,也不同意它是一个皱巴巴的野兽,难以理解的古怪之处。其实很容易理解。我不建议在更好的方法上使用它,但它仍然是 Win32 API 的受支持成员,并且仍然完全按照文档中的描述运行。它比被称为注册表的真正皱巴巴的野兽有一些好处,注册表实际上只不过是一个闪亮的 win.ini 版本。现实情况是,.ini 文件只是当今 .net 青睐的 .config 文件的简单版本。
  • 是什么让 GetPrivateProfileString 成为令人难以置信的皱巴巴的野兽?我真的很感兴趣。对于大多数应用程序,我看不出性能特征有多重要......应用程序配置通常不是瓶颈......(显然,INI 文件本身有许多缺陷,正如 Raymond Chen 在blogs.msdn.com/b/oldnewthing/archive/2007/11/26/6523907.aspx 中所述 - 但是这些看起来像是 INI 格式缺陷,而不是 GetPrivateProfileString 实现的皱纹。)
【解决方案2】:

它是来自 .ini 文件的 for reading。这是一个旧的 win16 API。你不应该使用它。

【讨论】:

    【解决方案3】:

    来自 MSDN:

    从初始化中的指定部分检索字符串 文件。

    注意

    提供此功能仅用于兼容 16 位 基于 Windows 的应用程序。应用程序应该存储初始化 注册表中的信息。

    语法

    DWORD WINAPI GetPrivateProfileString(
      __in   LPCTSTR lpAppName,
      __in   LPCTSTR lpKeyName,
      __in   LPCTSTR lpDefault,
      __out  LPTSTR lpReturnedString,
      __in   DWORD nSize,
      __in   LPCTSTR lpFileName
    );
    

    【讨论】:

    • 这没什么帮助。什么是初始化文件?我认为 smurf 需要那个级别的帮助,而不是 MSDN 复制/粘贴。
    【解决方案4】:

    这会从 .ini 文件中检索配置信息

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      相关资源
      最近更新 更多