我目前正在将图像保存到剪贴板。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。我收到了这个错误。
当该文件已存在时无法创建该文件。
有谁知道可能是什么问题?