用CreateDIBSection创建的HBITMAP进行OleDuplicateData复制出来的HBITMAP有问题?
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#define WHSIZE 32
int _tmain(int, char**)
{
BITMAPINFOHEADER bih = {0}; //生成位图信息头
bih.biSize = sizeof(bih);
bih.biBitCount = 24;
bih.biWidth = bih.biHeight = WHSIZE;
bih.biPlanes = 1;
bih.biSizeImage = bih.biWidth * 3 * bih.biHeight;
void* lpBits = NULL;
HBITMAP hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bih, DIB_RGB_COLORS, &lpBits, NULL, 0);
if (hBitmap != NULL)
{ //用CreateDIBSection创建HBITMAP
for (int i = 0; i < bih.biHeight; i++) //生成一个渐变位图
memset(((char*)lpBits) + i * bih.biWidth * 3, 0xFF * i / (bih.biHeight - 1), bih.biWidth * 3);
BITMAPFILEHEADER bfh = {0}; //生成文件头
bfh.bfType = 'MB';
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
bfh.bfSize = bfh.bfOffBits + bih.biSizeImage;
{ //写文件
HANDLE hFile = CreateFile(_T("E:\\a.bmp"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile)
{
DWORD dwUseless = 0;
WriteFile(hFile, &bfh, sizeof(bfh), &dwUseless, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwUseless, NULL);
WriteFile(hFile, lpBits, bih.biSizeImage, &dwUseless, NULL);
CloseHandle(hFile);
printf("%s", "Write a.bmp succeeded!\r\n");
}
}
HBITMAP hBitmap2 = (HBITMAP)OleDuplicateData(hBitmap, CF_BITMAP, 0); //用下面的CopyImage就没问题,或者源是LoadImage出来的也没问题
//HBITMAP hBitmap2 = (HBITMAP)CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, 0);
if (hBitmap2)
{
HDC hdc = GetDC(NULL);
if (hdc != NULL)
{
char chBits[WHSIZE * 3 * WHSIZE];
if (GetDIBits(hdc, hBitmap2, 0, bih.biHeight, chBits, (BITMAPINFO*)&bih, DIB_RGB_COLORS) != 0)
{
HANDLE hFile = CreateFile(_T("E:\\b.bmp"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile)
{
DWORD dwUseless = 0;
WriteFile(hFile, &bfh, sizeof(bfh), &dwUseless, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwUseless, NULL);
WriteFile(hFile, chBits, bih.biSizeImage, &dwUseless, NULL);
CloseHandle(hFile);
printf("%s", "Write b.bmp succeeded!\r\n");
}
}
ReleaseDC(NULL, hdc);
}
DeleteObject(hBitmap2);
}
DeleteObject(hBitmap);
}
system("PAUSE");
return 0;
}
用CreateDIBSection创建的HBITMAP进行OleDuplicateData复制出来的HBITMAP有问题,在一些地方会显示黑屏,一些地方直接返回失败。于是写了上面这段代码作测试,结果就是GetDIBits返回0,取不到像素数据。
如果把OleDuplicateData换成CopyImage则执行成功,两个BMP都可以保存,或者如果源HBITMAP是LoadImage创建的,OleDuplicateData出来的HBITMAP也可以正常访问。
这是BUG,还是本来就不能这么搞?
相关推荐
论文复现基于变频与移相协同控制的全桥LLC变换器模式切换平滑性优化(Simulink仿真实现)
内容概要:本文针对“基于变频与移相协同控制的全桥LLC变换器模式切换平滑性优化”这一主题,开展Simulink仿真实现与技术复现研究。通过构建全桥LLC谐振变换器的详细仿真模型,深入探讨在不同负载工况(如轻载、重载、待机与运行模式切换)下,如何结合变频控制(FM)与移相控制(PSM)的协同策略,优化系统动态响应的平稳性与效率。研究重点在于设计合理的控制逻辑,解决模式切换过程中可能出现的电压电流冲击问题,提升系统的稳定性和电能质量。文中系统阐述了控制策略的设计原理、关键参数的整定方法,并通过仿真结果验证了该协同控制方案在抑制瞬态扰动、实现无缝切换方面的有效性,完整复现了高水平学术论文中的核心技术路线,为电力电子变换器的先进控制提供了可复现的实践范例。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事开关电源、新能源变流器开发的工程师,尤其适合具备一定Simulink仿真经验与电力电子拓扑分析能力的专业人士; 使用场景及目标:①深入理解全桥LLC变换器在多模式运行下的变频与移相协同控制机理;②掌握在Simulink中对复杂谐振变换器进行建模、控制算法实现与仿真验证的全流程方法;③为学术论文写作、科研项目申报或高性能电源产品的工程开发提供可靠的技术参考与仿真基础; 阅读建议:建议结合所提供的Simulink模型文件与技术文档进行同步实践,重点关注变频与移相控制的切换逻辑、参数配合关系及过渡过程的动态特性,可通过调整负载条件观察系统的响应变化,以深化对模式切换平滑性实现机制的理解。
高校技术转移办公室人员如何高效完成科技成果全周期管理?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
可视化原型素材ppt格式
可视化原型素材ppt格式
氢氟醚:绿色高效的氟化解决方案.docx
氢氟醚:绿色高效的氟化解决方案.docx
2026最新广西省行政区划矢量图层-省市县乡镇四级行政区划数据下载
2026最新广西省行政区划矢量图层数据,包含省、市、县、乡镇四级行政区划数据,wgs84坐标


