DllMain加载其他DLL造成的死锁问题及其解决办法
使用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的那个类)的构造函数和析构函数里。
from:http://blog.csdn.net/clever101/article/details/5629512
DllMain加载其他DLL造成的死锁问题及其解决办法的更多相关文章
- Visual Studio《加载此属性页时出错》的解决办法
打开aspx页面时不能切换到设计视图,vs 2008工具箱中无控件.打开vs 2008的工具>选项>HTML设计器时提示:加载此属性页时出错 有时还会有其它错误提示,比如打开一个Windo ...
- WebView加载本地html、js文件常见问题及解决办法
声明:基于android studio平台,php语言搭建服务器 目录: 一.JavaScript脚本语言没有反应 二.alert无法弹出 三.html页面之间不能跳转 四.屏幕缩放没有达到预期效果 ...
- Android之com.nostra13.universalimageloader加载图片抛出OutOfMemroyError错误的多种解决办法
com.nostra13.universalimageloader是用来加载图片非常好的框架,但是也有问题,一旦图片过多的话,很容易就会提示OutOfMemroyError错误,也就是内存溢出的问题, ...
- IDEA错误: 找不到或无法加载主类 com.xxx.freight.dofreight.doFreight解决办法
1.右键点击工程,选择open Module Settings或点击File选择Project Structure,进入页面 2.选择Artifacts->JAR->From module ...
- EasyUI刚加载时候Window窗体自动弹出的解决办法
- vs2012 提示 未能正确加载 "Visual C++ Language Manager Package" 包 的解决办法
1.点击vs2012菜单栏 工具-> Visual Studio 命令提示 打开命令窗口 2.输入命令 "devenv /Setup" 3.重新打开vs2012
- 错误: 找不到或无法加载主类 Files\red5-server ,原因与解决办法
因为你把 red5放到了 Program Files 下,而Program Files 中间有个空格,启动路径不允许有空格,换个没空格的路径就OK啦
- C# 加载 SQLite DLL问题
/********************************************************************************* * C# 加载 SQLite DL ...
- VS2013编译经常卡在正在从以下位置加载xxx.dll的符号
换了系统后,重新下载了一个vs2013 with update2安装,编译的时候总是卡在 正在从以下位置加载xxx.dll的符号 如图: 解决方法: 进入VS---工具---选项----调试----符 ...
随机推荐
- 修改UISearchBar背景颜色
UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField. 要IB中没有直接操作背景的属性.方法一:是直接将 UISearc ...
- BZOJ 1491: [NOI2007]社交网络( floyd )
floyd...求最短路时顺便求出路径数. 时间复杂度O(N^3) ------------------------------------------------------------------ ...
- BZOJ 4321: queue2( dp )
dp(i, j, 1)表示前i个, 有j对是不合法的, i和i-1是在一起的. dp(i, j, 0)表示前i个, 有j对是不合法的, i和i-1不在一起的. 转移我们只需考虑是多了一对不合法的还是少 ...
- leetcode Integer to Roman python
class Solution(object): def intToRoman(self, num): """ :type num: int :rtype: str &qu ...
- JQuery 在$(window).load() 事件中 不运行 $(window).resize()
本文转载至: http://stackoverflow.com/questions/2597152/jquery-window-resize-doesnt-work-on-load 原文标题 :J ...
- Qt监测光驱变化(使用WM_DEVICECHANGE)
xxx.h protected: bool winEvent(MSG *msg,long * result); xxx.cpp bool CBlurayTranscoderDlg::winEvent( ...
- css 样式
<!doctype html> <html lang="en"> <head> <meta name="Generator&qu ...
- Windows Azure 现已完全受 Juju 支持
我们很高兴地宣布,Windows Azure 现已完全受 Juju 支持,这也是我们为实现开放性和互操作性而不断努力的结果.这意味着 Ubuntu 用户现在可以使用 Juju 及其直观的图形用户界面设 ...
- WS_CLIPCHILDREN与WS_CLIPSIBLINGS 收藏
英文单词解释clip:夹子.子弹夹.回形针:夹住,修剪sibling:同胞兄弟或姐妹overlapped:重叠 这两个Window Stype的特性与异同素来不太清楚,今日作一笔记:MSDN的解释为: ...
- data pump(数据泵)
先给出oracle给出的一个定义: “Oracle Data Pump technology enables very high-speed movement of data and metadata ...