关于 Gdiplus api 调用的bug解决以及注意事项

1. 在使用Gdiplus的类与函数时前面添加命名空间,以确保这是Gdiplus的类与函数。

2. 在需要调用调用Gdiplus类或函数的Dlg类的构造函数调用:
Gdiplus::GdiplusStartupInput gsi;
// m_pGdiplusToken为该类ULONG_PTR成员变量
Gdiplus::Status s = Gdiplus::GdiplusStartup(&m_pGdiplusToken, &gsi, NULL);
在析构函数中调用:
Gdiplus::GdiplusShutdown(pToken);
如果不调用,各个Gdiplus的类将初始化失败,类的GetLastStatus()函数将返回GdiplusNotInitialized。为了确保不产生内存越界写入的Bug。因为在调用完Gdiplus,立即调用时Gdiplus::GdiplusShutdown(pToken)时,会产生该Bug。
通过查询Graphics api得知。

3. 重点:一般通过
Gdiplus::Graphics* pGr = Gdiplus::Graphics::FromHDC(hDC);
获取该DC的Graphics类指针,在OnPaint函数中使用,并此函数不能使用窗体指针,否则Gdiplus api将返回ObjectBusy。
经过一两天排查才发现此问题引起的ObjectBusy。先是排在代码处OnPaint调用处,更换不同的Brush(如从PathGradientBrush到SolidBrush的更换),在OnButtonClick处调用,更换DC(从CPaintDC到窗口DC的更换),加上错误检查,再到与能正常调用Gdiplus的项目文件代码比对,更换Dialog资源,最后删除作不用的代码,直到换上可用的Gdiplus代码后,能正常运行,再看以的代码,发现有对窗体指针的使用,最终更换为变量代替后,代码正常运行。

以上是个人在MFC小程序上应用Gdiplus画图形界面的一些总结,以供参考。

参考:
安全注意事项:GDI+ - Win32 apps | Microsoft Learn
https://learn.microsoft.com/zh-cn/windows/win32/gdiplus/sec-gdiplus#allocating-buffers
posted @ 2023-11-13 10:54  明月忧忧  阅读(95)  评论(0编辑  收藏  举报