【问题标题】:How to use current Drive name in WritePrivateProfileString()如何在 WritePrivateProfileString() 中使用当前驱动器名称
【发布时间】:2014-05-23 17:43:39
【问题描述】:

如何找到运行可执行文件的当前驱动器名称?

我想使用 WritePrivateProfileString() 将字符串保存在 .ini 文件中。我想让文件名通用,因为硬编码完整路径或驱动器名称不是一个好主意。

谁能告诉我如何检索当前驱动器名称以在此 API 中使用。

我正在使用这样的 API:-

WritePrivateProfileString(_T("device"), _T("i2c_address"), temp, _T("D:\log.ini"));

我不想在这里对 D 进行硬编码,请告诉我如何使这个通用化。

【问题讨论】:

  • 不要保存在任何驱动器的根目录中。您想要的函数是SHGetKnownFolderPath,其中KNOWNFOLDERIDFOLDERID_ProgramData。这将为您提供应用程序数据文件夹的路径,您应该在其中存储应用程序数据(如 INI 文件)。搜索SO关于如何使用这个的问题,已经有很多了。
  • WritePrivateProfileString(_T("device"), _T("i2c_address"), temp, _T("D:\log.ini"));不会将 INI 文件保存在根目录中,这样 INI 文件就会存储在我的应用程序可执行文件所在的“D”驱动器的目录中。我只想知道如何从应用程序路径中获取第一个字母
  • 我比较确定这不是正确的。如果以D:\log.ini为路径调用函数,它将保存在D:\log.ini(驱动器D:的根目录),而不是应用程序的目录。但是,如果您传递相对路径(如log.ini),它将重定向到注册表。您需要一个绝对路径,例如使用GetModuleFileName 获得的路径。但随后您需要使用PathRemoveFileSpec 之类的方式删除EXE 名称。然后您将使用PathAppend 将该目录路径与您的文件名log.ini 连接起来。

标签: c++ winapi


【解决方案1】:

我相信您可以使用GetModuleFileName 获得正在运行的模块的完整绝对路径,对于您使用的活动模块:

GetModuleFileName(NULL,Buffer,BufferLength);

【讨论】:

  • 谢谢你,这很好用。但是你能告诉我现在应该如何在我的代码中使用这个缓冲区 [0] 来代替“D”吗?缓冲区是 LPWSTR 类型,在 API 中我需要传递一个 LPCTSTR 值?
  • 使用 std::wstring 或 std::basic_string
  • 即LPWSTR 是 WCHAR* 的 typedef,LPCTSTR 是 TCHAR const* 的 typedef,TCHAR 是 CHAR 或 WCHAR 的 typedef,具体取决于您是否进行 unicode 构建。如果 GetModuleFileName 使用 LPWSTR 编译,那么您正在构建 unicode。
  • 这个答案不完整。它告诉如何获取应用程序的可执行文件的路径,但它没有告诉如何去除可执行文件名和扩展名以仅获取路径 (PathRemoveFileSpec),或者如何将其附加到所需的 INI 文件名(PathAppend)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2016-08-01
  • 2010-09-14
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多