我在OCX中使用到了GDI+, 是在COleControl 的派生类 CMultiwndCtrl 中构造和析构的,但是我的OCX中,有一个对话框类,也使用到了GDI+对象(new 了一些对象), 这样在退出程序的时候就有问题了。因为CMultiwndCtrl 在对话框类前构造,所以先析构,析构的时候就调用过来 Gdiplus::GdiplusShutdown(m_gdiplusToken);这样在对话框类的析构函数中,就无法 delete 这些对象了。
不知道大家在ocx中如何使用GDI+的? 求助我自己在CMultiwndCtrl 中写了个清理函数,在释放GDI+前先清理GDI+对象可以吗? 

解决方案 »

  1.   

    我是这样做的,不知道会不会有问题,因为断点进去后发现成员 窗口的句柄都为0X00000000,所以在窗口类的Destory()中去清理了。 但是程序还有异常指针,真郁闷啊
      

  2.   

    在进行GDI+初始化和释放的时候进行判断,看是否已经初始化,或已经释放。程序本身需要调用,OCX也需要判断。我之前的项目遇到类似的问题,由于OCX释放了,然后一些类的析构函数还调用了GDI+的函数,导致程序死机。如果出现这样的情况,那么就把初始化和释放GDI+的任务交给调用程序吧,OCX不进行初始化和释放。
      

  3.   

    建议你去掉初始化和释放的代码,然后在任意一个CPP文件中加入下述代码:CImage __dont_use__;构造一个全局对象即可。
      

  4.   


    没理解? 是我使用全局的对象 还是添加了CImage __dont_use__;以后,就可以正常使用了、
      

  5.   

    你看看CImage的源码,它是怎么自动初始化GDI+的。构造一个全局对象就是为了自动初始化和释放。