【问题标题】:LoadImageW returns null c++ win32C++ win32 LoadImageW 返回 null
【发布时间】:2021-01-14 23:37:37
【问题描述】:

我开始制作一个简单的 c++ Win32 程序。我只是试图将图像加载到窗口中,但它并没有真正起作用。我调试了一段时间,我知道问题是我的 LoadImageW() 函数返回 null。代码:

void loadImages() {
  hPic1 = (HBITMAP)LoadImageW(NULL, L"pic.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  if (hPic1== NULL) {
      MessageBox(NULL, L"Error", L"LoadImage error", MB_OK);
  }
}

.bmp 文件与 .cpp 文件位于同一目录中,我什至尝试使用整个路径,但没有成功。我没有收到任何错误,并且主窗口正确加载,但是没有显示图像并且出现了消息框。 loadImages() 函数在窗口的 WM_CREATE 处被调用。 SendMessageW() 函数如下所示:

SendMessageW(hImageWindow, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hPic1);

感谢您的帮助,祝您有美好的一天!

【问题讨论】:

  • 错误代码是什么?
  • The documentation says to call GetLastErrorGetLastError() 的值是多少?另外,在调用GetLastError 之前不要调用MessageBox -- 在确定hPic1 为NULL 之后,应立即调用GetLastError
  • 错误是(翻译自我的语言)类似于“任务已成功完成”
  • “.bmp 文件与 .cpp 文件位于同一目录中” - 这无关紧要。一旦编译器完成生成目标代码,有关源文件所在位置的信息就会丢失。也就是说,声音代码将始终使用完全限定的路径名​​。如果函数以完全限定的路径名​​失败,则假定文件无效是合理的。要解决此问题,请在 MS Paint 中打开文件并再次保存。这将产生一个有效的 BMP 文件。
  • @IInspectable 我这样做了,现在我没有收到任何错误,并且图像加载成功。谢谢!

标签: c++ winapi


【解决方案1】:

调用 LoadImageW 或任何导致意外结果的 win api 函数后!检查 MADN 中的文档,尤其是“备注”部分! 根据文档,调用 GetLastError() 可能很好!通过检查错误代码可以发现问题,例如“找不到文件”、访问权限错误等。

您可以在页面https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes 中找到GetLastError() 返回的每个错误代码的描述,或通过Visual Studio IDE 在工具-> 错误查找菜单中查看!

【讨论】:

  • 您必须小心,不要对文档未说明的函数执行此操作。
  • 您还必须小心,仅在文档中明确说明的条件下准确地在正确的时间调用GetLastError,而不是稍后。后者似乎对 C++ 开发人员特别麻烦。
猜你喜欢
  • 2021-08-09
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多