【问题标题】:Use relative file path with LoadImage将相对文件路径与 LoadImage 一起使用
【发布时间】:2013-03-30 14:21:56
【问题描述】:

我正在尝试通过LoadImage 函数从win32 中的相对文件路径加载文件。我使用的 URL 确实存在,出于测试目的,使用与资源文件中添加的位图相同的 URL。

Image = (HBITMAP)LoadImage(NULL, "..\\..\\Images\\Mage default.bmp",
                           IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

但是,它返回错误代码 2,表示找不到文件。我已经用谷歌搜索了这个问题,并参考了 MSDN,但我找不到任何说明如何使用 LoadImage 的相对文件路径。

LoadBitmap 和预定义的位图似乎可以正常工作,但在这种情况下似乎不起作用。任何帮助将不胜感激

【问题讨论】:

  • 在很多情况下不建议使用反向相对寻址。它使程序员的管理路径复杂化。
  • 依靠正确设置的默认工作目录永远不会停止伤害。当它在正常安装位置的用户机器上运行时,这将不起作用。没有 c:\program files\images 目录。从 GetModuleFileName() 生成绝对路径名,传递 NULL 以找出 EXE 的存储位置。
  • @HansPassant 好的,非常感谢。将上面生成的相对路径和绝对路径结合起来,应该很容易生成绝对文件路径。

标签: c++ winapi


【解决方案1】:

首先,检查文件是否存在,并且当前目录是你所期望的。

另外,您可以使用GetFullPathName 之类的函数将相对路径转换为绝对路径。

【讨论】:

  • GetFullPathName 在尝试获取绝对路径时返回错误值
  • 我认为错误不在 GetFullPathName 中。检查 GetCurrentDirectory 的内容。
  • 抱歉回复晚了,但经过一番修改后,GetFullPathName 起作用了。非常感谢
【解决方案2】:

您拥有的相对路径是根据您的进程/运行时工作目录计算的,而不是根据您在编译时的静态文件位置计算的。

【讨论】:

  • 我知道这取决于当前文件的位置,但我之前已经检查过了,它位于正确的位置。为了确保这一点,我使用 SetFileLocation() 将文件位置重置为初始位置,通过函数开头的 GetFileLocation 检索。
  • 你能通过 GetWorkingDirectory() 验证你的 CWD 是什么吗?
  • 我似乎无法让 GetWorkingDirectory 工作,但 GetCurrentDirectory 返回正确的值
  • 我的错确实是GetCurrentDirectory,作为调试提示,如果您硬编码路径并提供图像的完整路径,API 是否成功返回?
  • 是的,我刚刚阅读了上面的评论,告诉我使用其他函数生成绝对路径名,这样应该可以正常工作
【解决方案3】:

这可能是一个旧帖子,但偶然发现了这个问题(在我的例子中是一个头文件)并找到了答案,这里是:

如果引用相对路径,则第一个目录前面没有反斜杠。

在本例中,该行将是:

(HBITMAP)LoadImage(NULL,"Images\\Mage default.bmp",...

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 2020-10-16
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多