DLL中GDIPlus初始化和退出时注意的问题

转载 2012年03月29日 14:23:28
转载的别人的文章,因为自己也在实际工程中遇到类似的问题。

DLL工程中使用GDIPlus
2009-08-04 14:51

前段时间项目的需求有所更改,因此我将工程中部分GDI改为了GDI+,主要是为了增加图片格式的支持,没时间看东西了,而因为我以前对于GDI+比较熟,所以就直接用GDI+了。

一开始在几个工程的Dllmain中添加Gdiplus的GdiplusStartup和GdiplusShutdown,不过发现在生成时 注册输出一步老卡在那里不动,必须手动取消生成。在使用上倒没遇到什么大问题,因此也就暂时扔那里了。

今天工作暂告一段落,就来分析这个问题。首先定位到是gdiplus引起的,而后搜索了不少资料,发现是对于GDI+的初始化有问题,在dll工程中不能在dllmain文件中进行GDI+的初始化。

详见http://msdn.microsoft.com/en-us/library/ms534077(VS.85).aspx

Remarks 

You must call GdiplusStartup before you create any GDI+ objects, and you must delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown. 

You can call GdiplusStartup on one thread and call GdiplusShutdown on another thread as long as you delete all of your GDI+ objects (or have them go out of scope) before you call GdiplusShutdown. 

Do not call GdiplusStartup or GdiplusShutdown in DllMain or in any function that is called by DllMain. If you want to create a DLL that uses GDI+, you should use one of the following techniques to initialize GDI+: 


Require your clients to call GdiplusStartup before they call the functions in your DLL and to call GdiplusShutdown when they have finished using your DLL. 
Export your own startup function that calls GdiplusStartup and your own shutdown function that calls GdiplusShutdown. Require your clients to call your startup function before they call other functions in your DLL and to call your shutdown function when they have finished using your DLL. 
Call GdiplusStartup and GdiplusShutdown in each of your functions that make GDI+ calls.

GDI+ 对象释放崩溃的问题

确保在Gdiplus::GdiplusShutdown(m_gdiplusToken); 之前delete 掉GDI+的对象,例如:delete *pBitmap; 如果先Gdiplus::Gdip...
  • sundan308
  • sundan308
  • 2013年12月03日 15:22
  • 1488

GDIplus的初次接触--加载并显示常用格式图片

在没有接触Gdiplus之前,在vc中绘制图片,通常加载一张位图,然后进行贴图。对于现在多种多样的图片格式,之前的GDI并不支持(应该是这样的,呵呵)。而使用Gdiplus则可以选择多种图片格式,比如...
  • s634772208
  • s634772208
  • 2015年06月01日 09:56
  • 5893

gdiplus函数调用错误导致程序Crash分析

前几天帮其他team看一个Crash的问题,下面是问题分析.复现问题,获得如下log.4aea74b2 ??              ???0:006> kbChildEBP RetAddr  Ar...
  • LorenZhai
  • LorenZhai
  • 2011年05月19日 13:50
  • 1980

[GDI+] GdiPlus在dll中的初始化位置

GDI+的初始化和反初始化  是调用GdiplusStartup 和 GdiplusShutdown 如果dll中使用了GDI+,GDI+的初始化应该放在哪里?可以放在DllMain()中吗? 答...
  • felicityWSH
  • felicityWSH
  • 2017年03月06日 10:18
  • 905

GdiPlus使用方法

GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。 在Windows操作系统下...
  • bingdianlanxin
  • bingdianlanxin
  • 2015年08月13日 14:20
  • 6200

GDIPlus开发库及帮助文档

  • 2010年07月09日 15:02
  • 6.7MB
  • 下载

在 VC6 中使用 GdiPlus(三)

Step2:安装    理论上讲,把下载回来的这些文件放在硬盘上的任意一个位置都是可以的,只要在 Step3 中进行相应正确的配置,都能够在 VC6 中把 GdiPlus 用起来。我采取的做法是:(1...
  • duxiuxing
  • duxiuxing
  • 2007年05月31日 13:18
  • 3966

在 VC6 中使用 GdiPlus(五)

下面用 VC6 来写一个 GdiPlus 的 Demo 工程 Step1:新建一个名为 Demo_GdiPlus 的 MFC AppWizard(exe) 工程操作步骤:(1)主菜单File->New...
  • duxiuxing
  • duxiuxing
  • 2007年06月01日 15:47
  • 4335

win32程序中如何使用GDIPlus

方法一: 删除宏定义: #define WIN32_LEAN_AND_MEAN 加上gdiplus.lib引用: #pragma comment(lib, "gdiplus.lib") ...
  • analogous_love
  • analogous_love
  • 2015年01月05日 11:02
  • 1715

GDIPlus的头文件和库

  • 2011年03月21日 11:14
  • 101KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DLL中GDIPlus初始化和退出时注意的问题
举报原因:
原因补充:

(最多只允许输入30个字)