【问题标题】:Why does GetObject fail here when lbvobject is NULL为什么当 lbvobject 为 NULL 时 GetObject 在这里失败
【发布时间】:2016-08-31 17:04:43
【问题描述】:

GetObject() 文档说,当lpvObject 为 NULL 时,函数返回所需的字节数。但是,我得到的是 0,这是失败时的返回值。

我一直在寻找并试图找出我做错了什么。

我刚刚使用WM_PAINT 消息进行了基本的窗口设置:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc;
    hdc = BeginPaint(hwnd, &ps);
    HBITMAP hbmap;
    hbmap = (HBITMAP) LoadImage(NULL, str_path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    BITMAP bm;
    HDC bmapmemory = CreateCompatibleDC(hdc);
    SelectBitmap(bmapmemory, hbmap);
    int a = GetObject(hbmap, sizeof(BITMAP), NULL);

    BitBlt(hdc, 0, 0, 750, 750, bmapmemory, 0, 0, SRCCOPY);
    char c[64];
    sprintf_s(c, sizeof(c), "%f\n", a);
    OutputDebugStringA(c);

    DeleteDC(bmapmemory);
    DeleteObject(bmap);

    EndPaint(hwnd,& ps);

    return 0;
}

正如我所说,a 对于 GetObject() 函数调用而言始终为 0,即失败。

【问题讨论】:

  • hbitmap 实际上是一个有效的句柄吗?可能不会。首先,检查它是否为非NULL。如果是这样,请在致电LoadImage 后检查GetLastError。 (有点奇怪,该变量通常拼写为hbmap,除了在对GetObject 的调用中,您拼写为hbitmap。我认为这只是一个错字,但是在复制和粘贴时应该不可能出现错字真正的代码到你的堆栈溢出问题...)
  • 你的意思是“hbmap”吗?
  • 是的,我的意思是 hbmap,当我删除一些不相关的东西时,这是一个错字。编辑谢谢。奇怪的是,句柄被成功创建且非空,并正确地在屏幕上显示。
  • 您没有进行任何错误检查,并且 %f 是错误的格式字符串。这不是实际代码,因为您没有粘贴它。所以谁知道发生了什么。 mcve 将消除疑虑。

标签: c++ winapi gdi


【解决方案1】:

您使用"%f" 格式但传递一个整数。那是未定义的行为。如果您查看调试器中的返回值,您可能会发现它不是为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2017-06-22
    • 2021-05-09
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多