一个使用动态链接库资源出错的难题

在DLL弹出一个对话框,开始弹出对话框时出现“Debug Assertion Failed”,
上网搜了下,发现模块句柄的设置问题。然后作出如下解决:
1. 定义两个全局变量:

HINSTANCE g_hModuleInstance = NULL;
HINSTANCE g_hOldModuleInstance = NULL;

2.在DllMain函数中对g_hModuleInstance进行赋值:

  g_hModuleInstance = hInstance;

3.在要使用对话框资源的类新建两个函数设置模块句柄。
    
void CAlternatExtractFun::SetResourceHandle()
{
g_hOldModuleInstance = AfxGetModuleState()-

> m_hCurrentResourceHandle;
AfxGetModuleState()-> m_hCurrentResourceHandle = g_hModuleInstance;
}

void CAlternatExtractFun::RestoreResourceHandle()
{
AfxGetModuleState()-> m_hCurrentResourceHandle  

=g_hOldModuleInstance;
}

4.在使用对话框资源的函数里调用这两个函数:
void CAlternatExtractFun::Execute()
{

   SetResourceHandle();

   CAlterExtractDlg dlg;
   dlg.DoModal();

   RestoreResourceHandle();
}

    但是运行时dlg.DoModal();这一行出错:Debug Assertion Failed!
然后调试进行:

在 CDialog::DoModal()函数中的
TRY
{
// create modeless dialog
AfxHookWindowCreate(this);
if (CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle

(hWndParent), hInst))

   在运行CreateDlgIndirect(lpDialogTemplate,
CWnd::FromHandle

(hWndParent), hInst)这一句出现Debug Assertion Failed!

再进入CreateDlgIndirect函数:
BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,
CWnd* pParentWnd, HINSTANCE hInst)
{

#ifdef _DEBUG
if ( AfxGetApp()-> IsKindOf( RUNTIME_CLASS( COleControlModule ) ) )
{
TRACE(traceAppMsg, 0, "Warning: Creating dialog from  

within a COleControlModule application is not a supported scenario.\n");
}
#endif

  在AfxGetApp()-> IsKindOf( RUNTIME_CLASS( COleControlModule ) 出错。

然后上网搜索CreateDlgIndirect函数。网上有个说法说是
#ifdef _DEBUG
if ( AfxGetApp()-> IsKindOf( RUNTIME_CLASS( COleControlModule ) ) )
{
TRACE(traceAppMsg, 0, "Warning: Creating dialog from  

within a COleControlModule application is not a supported scenario.\n");
}
#endif

是VS C++ 2005+sp1的一个bug.下面是网友的一个算法:

楼主wangjia184(我就是传说中的。。。。。。SB)2006-10-24 14:36:40 在  

VC/MFC / 基础类 提问
先说说程序的结构    
    
    
  这是一个VS2005的插件,属ATL    
  ATL中隐式链接到一个MFC   DLL,MFC   DLL中是有Dialog    
  以前使用   盗版的VS2005   中文版,   没打补丁。一切正常    
    
    
  这2天把系统重装了,换成了正版的VS2005英文版,还打了SP1(Beta)补丁    
  问题就出现了!    
    
  当Dialog   DoModal()的时候,报错。    
    
  错误堆栈如下:    
  DoModal()   调用了   CreateDlgIndirect()    
    
    
    
  CreateDlgIndirect   中最开始有一段:    
  #ifdef   _DEBUG    
  if   (   AfxGetApp()-> IsKindOf(   RUNddTIME_CLASS(   COleControlModule    

)   )   )    
  {    
  TRACE(traceAppMsg,   0,   "Warning:   Creating   dialog   from   within  

a   COleControlModule   application   is   not   a   supported    

scenario.\n");    
  }    
  #endif    
    
  其中的AfxGetApp返回NULL,   我的DLL入口是DllMain,这个AfxGetApp肯定会返回

NULL    
  所以在这里报错了    
    
    
  使用Release   版本运行,一切正常,   好像这段是打了SP1加上去的。    
    
  我晕死了     难道以后都要在Release版本下调试?    
  问题点数:50、回复次数:5  

     不知大家怎么认为,还有我的问题怎么解决呢?

我的编译环境:
win xp sp2
VS C++ 2005+ sp1
intel 双核处理器

回复人: sjdev 2008-3-9 12:09:45

无主题
hOldHandle = AfxGetResourceHandle();
AfxSetResourceHandle(hDll);
...
use the resource in the dll
...
AfxSetResourceHandle(hOldHandle);

回复人: clever101 2008-3-9 12:11:55

hDll?照这样还得先LoadLibrary了

 

 

from:http://topic.okbase.net/200803/2008030911/3291771.html

参考:http://social.microsoft.com/Forums/en-US/visualcpluszhchs/thread/9e459adc-dc68-491a-8632-8cb23ef6566f

时间: 2024-09-20 09:45:33

一个使用动态链接库资源出错的难题的相关文章

解决IRQ、DMA资源出错的故障

  故障现象:提示分配IRQ.DMA资源出错 故障处理:针对故障情况,可在BIOS中进行IRQ.DMA的资源分配,具体方法如下: 1. 在BIOS设置主界面中选择"PnP/PCI Configurations"选项,按键后进入设置界面. 2. 在该界面中选择"Resources Controlled By"选项,在弹出的设置界面中通过上下方向键进行选定设置,完成后保存并退出BIOS即可. "Resources Controlled By"选项可以

python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错

问题描述 python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错 python多媒体编程 我在安装完PyOpenGL3.0.1后,运行根据书里面写的一个脚本,却出错 解决方案 这个就是ctypes没找到,你尝试把环境变量什么的好好配置一下

c++-为什么监控画面锁屏后解锁获取不到资源出错,求解?

问题描述 为什么监控画面锁屏后解锁获取不到资源出错,求解? 下列是D3D绘制图像的函数代码,没有锁屏之前监控画面好好的,锁屏之后再解锁就获取不到监控画面了,锁屏会对程序有影响吗?求指点迷津. void ComponentBase::Draw(BYTE* data) { D3DLOCKED_RECT d3dRect; g_pTexture->LockRect( 0, &d3dRect, 0, 0 );// 锁住纹理 // 填充数据 BYTE *pDst = (BYTE *)d3dRect.pB

mfc-请教一个MFC程序运行出错的问题

问题描述 请教一个MFC程序运行出错的问题 void CMainFrame::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CTime time; struct tm* osTime; time = CTime::GetCurrentTime(); osTime = time.GetLocalTm(NULL); m_strTime.Format("%2d:%2d:%2d:",osTime->tm_hour,o

c#-一个关于C#文本换行的难题

问题描述 一个关于C#文本换行的难题 暂时不考虑中文,有一段英文,我想按照每行最多100个字符分割,但是单词中间不能割开,请问怎么做?最好用link实现. 解决方案 完整地写一个给你参考,为了在控制台输出方便,我用的是70个字符 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleAp

在eclipse里面import一个完整的project出错Action cannot be resolved to a type

问题描述 在eclipse里面import一个完整的project出错Actioncannotberesolvedtoatype,但是为什么之前用都是好的,重新import之后就出现这个问题,不知道该怎么解决,望高手指教! 解决方案 解决方案二:原来项目里引用的jar包路径找不到了,重新通过buildpath把找不到的jar包添加一下.解决方案三:但是把那些jar加进去之后还是这样struts.jar都加了没起作用解决方案四:就是没找到相应的类或者jar的原因...

访问Windows 2008共享资源出错解决方法

为了能够更方便地与局域网中的其他员工相互交流,我们时常会通过共享访问方式,来与他人互相传输文件.发送数据.为了让共享访问操作更加更效,我们还总结了许多行之有效的操作秘籍,可是这些秘籍几乎都是在传统系统环境下总结出来的,它们能不能在Windows Server 2008系统环境下有效呢?其实Windows Server 2008系统是一种与众不同的操作环境,在该环境下沿用传统秘籍肯定会遇到一些奇怪的共享访问故障:为此,我们现在就对Windows Server 2008环境下出现的一些常见共享访问错

写了一个Office文件资源提取工具,希望大家多多指教

问题描述 这个工具可以把docx,xlsx,pptx类型的Office文件中的各种资源提取提取出来.这些可提取的资源包括声音,图像,视频等等.比如有一个文档叫text.docx,这个文档中有个图片叫a.jpg,那么使用这个工具则可以把a.jpg提取出来,并且保证图片不失真.资源地址:http://download.csdn.net/detail/lvmeng0206/3910877 解决方案 解决方案二:楼主太强了,学到不少,期待楼主的其他资源!!解决方案三:O(∩_∩)O谢谢分享,学习了.解决

数据中心整合:一个经理的资源清单

近年来,云计算市场得以迅速增长,而各种数据中心服务的新需求也在持续增长.云提供商和数据中心合作伙伴正在日以继夜地工作,使他们的环境尽可能高效.这是为什么?是为了最大限度地提高他们的底线,以保持竞争力. 在目前竞争激烈的数据中心和云计算市场中,市场领军企业在运行最优化和成本效益的同时,还要提供优越的服务.为了实现这一目标,企业还要考虑一些事情.首先,在市场上领先并不总是意味着增加更多的设备.智能数据中心和云服务提供商要学会充分利用自己所拥有的资源.另外,在新的数据中心效率概念中,有人提出一些新的问