DllMain()函数中的DirectDrawCreateEx()为什么会阻塞?

red-fly 2011-05-23 06:06:18
背景:
在动态库里一直好好地使用着ddraw,结果ie9出来之后,发现一个程序如果先加载了IE再初始化ddraw的时候会失败,而在加载IE之前初始化ddraw之后再加载IE就正常。所以下面的目标就是要在加载IE之前初始化ddraw

问题:
为了尽早地初始化ddraw,选择了在动态库的DllMain()的DLL_PROCESS_ATTACH分支里进行初始化ddraw,但出现了DirectDrawCreateEx()不会返回的问题,代码如下:


BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
LoadDDraw();
}
break;
case DLL_THREAD_ATTACH:
....
}
}

void LoadDDraw()
{
LPDIRECTDRAW7 pDDraw7;
if(DirectDrawCreateEx(NULL,(void **) &pDDraw7, IID_IDirectDraw7, NULL)) // 结果就这一行被塞住了!
{
DDCAPS capsDrv;
ZeroMemory(&capsDrv, sizeof(capsDrv));
capsDrv.dwSize=sizeof(capsDrv);
if(!pDDraw7->GetCaps(&capsDrv, NULL))
{
if ( capsDrv.dwCaps & DDCAPS_NOHARDWARE )
{
// 硬件不支持。
}
}
pDDraw7->Release();
}
}


不知道大家有没有碰到过这个问题
...全文
207 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zzz3265 的回复:]

DllMain 系统有锁, DirectDrawCreate可能会导致加载一些dll, 或线程, 这样会重新进入DllMain, 在这系统会检查锁, 导致阻塞
[/Quote]
原来如此!一出现这个问题,我就感觉DllMain()可能是比较特殊的,所以就会有某些限制
Yofoo 2011-06-30
  • 打赏
  • 举报
回复
DllMain 系统有锁, DirectDrawCreate可能会导致加载一些dll, 或线程, 这样会重新进入DllMain, 在这系统会检查锁, 导致阻塞
Eleven 2011-05-24
  • 打赏
  • 举报
回复
学习~
red-fly 2011-05-24
  • 打赏
  • 举报
回复
1. 不指定版本,我不知道如何试哦,好像都得指定,如果使用DirectDrawCreate,则没有办法使用ddraw7的对象,好像用起来比较麻烦,所以没有再摸索了
2. 我声明了一个类,然后定义了这个类的一个全局变量,在这个类的构造函数中初始化ddraw,还是一样,DirectDrawCreateEx()返回不了
3. DllMain()可能的确有很多限制,不过没有研究过。为了避开这个问题,我就定义了一个新的接口来专门初始化ddraw,此dll一被加载,就要求加载它的程序来调用这个接口,结果还是阻塞到了DirectDrawCreateEx(),也不知道是咋回事
red-fly 2011-05-24
  • 打赏
  • 举报
回复
问题解决了,声明全局变量LPDIRECTDRAW7,然后
dllmain()->DLL_PROCESS_ATTACH->createthread->(在线程里)init_ddraw,注意在初始化ddraw后不要再关闭ddraw对象,所谓的初始化ddraw,实际上就做了两件事:DirectDrawCreateEx和GetCaps
red-fly 2011-05-24
  • 打赏
  • 举报
回复
现在的主要问题是DirectDrawCreateEx()会一直被阻塞,没有办法继续啊
IONPhantom 2011-05-23
  • 打赏
  • 举报
回复
DirectDraw 还是 DX7 时候的事了, DX8 开始就没有 DDraw 了, 你现在要在 Win7 下用 DDraw 那肯定会有各种问题
redui 2011-05-23
  • 打赏
  • 举报
回复
而且DllMain中的代码有很多限制
redui 2011-05-23
  • 打赏
  • 举报
回复
DllMain显然还不是最早执行的,全局变量的构造函数才是最早的,不如放到某个全局变量的构造函数中去试试。
zhouzhipen 2011-05-23
  • 打赏
  • 举报
回复
代码看不出问题,不指定DDraw的版本试试
内容概要:本文系统研究了基于CNN-SVM的卷积神经网络与支持向量机融合的数据分类预测方法,聚焦其在工业故障识别的应用,提供了完整的Matlab代码实现。通过CNN提取输入数据的深层空间特征,再由SVM进行高精度分类,充分发挥两者优势,有效提升了故障识别的准确性、鲁棒性与泛化能力。该方法特别适用于处理电力系统、机械设备等领域的高维、非线性、强噪声监测数据,在变压器故障诊断、轴承缺陷识别等场景具有重要应用价值。文档还整合了机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研方向的技术资源,配套大量Matlab/Simulink仿真案例与Python代码,全面支持科研复现与工程实践。; 适合人群:具备一定编程基础,熟练掌握Matlab或Python语言,从事电气工程、自动化、人工智能、机械故障诊断等相关领域研究的研发人员及高校研究生; 使用场景及目标:① 实现工业设备的状态监测与多类别故障分类;② 深入理解CNN与SVM融合模型的设计原理与工程实现细节;③ 借助所提供的丰富算法案例开展科研复现、模型优化与系统仿真验证; 阅读建议:建议按照文档目录结构系统化学习,结合百度网盘提供的完整代码资源进行动手实践,重点关注CNN特征提取层与SVM分类器之间的数据接口设计与参数调优策略,同时可延伸学习文涉及的其他智能算法及其在电力系统、信号处理等领域的交叉应用,全面提升科研创新能力。

19,464

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧