0

我目前正在将图像保存到剪贴板。base64 数据来自浏览器 (base64),通过 WebSocket 传递并由 C++ 应用程序处理。

我的问题是在 C++ 端将 base64 代码转换为字节数组,然后将 HBITMAP 转换为 BITMAP,然后将其保存到剪贴板。

我使用CryptStringToBinaryA将 base64 (len: 95000) 转换为字节数组 (len: 70000)。

bRet = CryptStringToBinaryA(
        base64,
        strlen(base64),
        CRYPT_STRING_BASE64,
        &bytes[0],
        &length,
        NULL,
        NULL);

然后,从字节数组中,我使用CreateDIBSection来获取HBITMAP

    tagBITMAPFILEHEADER bmfh = *(tagBITMAPFILEHEADER*)bytes;
    tagBITMAPINFOHEADER bmih = *(tagBITMAPINFOHEADER*)(bytes + sizeof(tagBITMAPFILEHEADER));
    RGBQUAD rgb = *(RGBQUAD*)(bytes + sizeof(tagBITMAPFILEHEADER) + sizeof(tagBITMAPINFOHEADER));

    BITMAPINFO bi;
    bi.bmiColors[0] = rgb;
    bi.bmiHeader = bmih;

    byte* pPixels = (bytes+bmfh.bfOffBits);

    void* ppvBits;
    HDC hdc = GetDC(NULL);
    HBITMAP hBitmap = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &ppvBits, NULL, 0);
    SetDIBits(NULL, hBitmap, 0, 500, pPixels, &bi, DIB_RGB_COLORS);

这是导致问题的原因,因为ppvBits 返回 0

当我尝试执行GetObject时,它返回 0。

GetObject(hBitmap, sizeof(BITMAP), NULL)

我还尝试在 GetObject 之后执行 GetLastError。我收到了这个错误。

当该文件已存在时无法创建该文件。

有谁知道可能是什么问题?

4

0 回答 0