使用VS 2008新建一个MFC ActiveX工程,因为在工程里要用到GDI+。我习惯把初始化GDI+库的代码放在应用程序类的InitInstance函数,对应的销毁代码放在ExitInstance函数。具体如下:
先在应用程序类里定义一个数据成员:
- ULONG_PTR m_gdiplusToken;
然后添加初始化GDI+库的代码和对应的销毁代码:
- BOOL CImagePreviewXApp::InitInstance()
- {
- BOOL bInit = COleControlModule::InitInstance();
- if (bInit)
- {
- // TODO: Add your own module initialization code here.
- // Initialize GDI+ 的初始化代码,建议放在//InitInstance函数
- GdiplusStartupInput gdiplusStartupInput;
- GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
- }
- return bInit;
- }
- // CImagePreviewXApp::ExitInstance - DLL termination
- int CImagePreviewXApp::ExitInstance()
- {
- // TODO: Add your own module termination code here.
- GdiplusShutdown(m_gdiplusToken);
- return COleControlModule::ExitInstance();
- }
结果在编译时老是出现一个问题,就是编译时输出窗口:
1>Embedding manifest...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
1>Copyright (C) Microsoft Corporation. All rights reserved.
1>Registering output...
到了这里,VS 2008就像停滞一样,半天不反应,直到我取消生成。我以为是VS 2008的bug,因为我用VS 2010编译这个工程并无这个现象(这个实在有点令人奇怪!)。到论坛一问,蒋晟大侠告知:在DllMain的封装函数InitInstance中有加载其他DLL造成了死锁。
怎么解决这个问题呢?一种方法是写两个接口函数分别实现初始化GDI+库和对应的销毁功能。我懒得写两个接口函数,干脆把这个工作放在ActiveX控件类(派生自COleControl的那个类)的构造函数和析构函数里。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2012-11-21 assert()函数用法总结 .
2012-11-21 堆和栈的区别(转过无数次的文章) .
2012-11-21 Win32 多线程的创建方法和基本使用 .
2012-11-21 stdcall、cdecl 和pascal简介 .
2012-11-21 windows程序调试
2012-11-21 VS2005设置可以在Release模式下调试 .
2012-11-21 如何在对话框中实现文件拖放功能