zoukankan      html  css  js  c++  java
  • 一个使用动态链接库资源出错的难题

    在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

  • 相关阅读:
    火爆全网的合成大西瓜小游戏魔改版大全
    [Qt]cmake下Qt隐藏console的窗口
    c# WebBrowser控制台输出执行js后的网页内容
    好的编程习惯是减少bug最有效的方法
    创建线程 出现SIGSEGV crash
    linux下进程创建/僵尸进程/孤儿进程
    C++实现不可被继承的类
    程序并发概述
    C++ vector实现原理
    C++深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/lidabo/p/2783199.html
Copyright © 2011-2022 走看看