没有找到MFC80D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复问题。…

没有找到MFC80D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复问题。…

大家好,又见面了,我是全栈君。

在用VS2005学习C++调试程序的时候,按F5键,总提示这个问题,
没有找到MFC80D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复问题。...
不晓得什么原因,网上有的说找到MFC80.DLL复制到程序目录中,也有的说复制到安装目录中,可结果很失望,也有的VS2005安装有问题,系统有问题等等。最后还是用以下方法解决了:

在“启动调试F5”的工具图标右侧有一栏“解决方案配置”,将其中的“Debug”改为“Release”,没有找到MFC80D.DLL,因此这个应用程序未能启动。重新安装应用程序可能会修复问题。...

F5通过,运行正常,项目目录下生成“Release”文件夹,Debug方式生成的“Debug”文件夹是无用的。原因: 

  DEBUG和RELEASE 版本差异及调试相关问题:
  I. 内存分配问题

  1. 变量未初始化。下面的程序在debug中运行的很好。

      thing * search(thing * something)
        BOOL found;
        for(int i = 0; i < whatever.GetSize(); i++)
          {

          if(whatever[i]->field == something->field)
             { /* found it */
              found = TRUE;
              break;
             } /* found it */
           }
    if(found)
             return whatever[i];
    else
             return NULL;
  而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。

  2.数据溢出的问题 
        如:char buffer[10];
             int counter;
       lstrcpy(buffer, “abcdefghik”);

  在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。
  3.DEBUG版和RELEASE版的内存分配方式是不同的。如果你在DEBUG版中申请   ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes为单位分配),而在release版,分配给你的就是24bytes(release版以8bytes为单位),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有ACCESS VIOLATE。

  II.ASSERT和VERIFY

  1.ASSERT在Release版本中是不会被编译的。

  ASSERT宏是这样定义的

        #ifdef _DEBUG
        #define ASSERT(x) if( (x) == 0) report_assert_failure()
        #else
        #define ASSERT(x)
        #endif
        实际上复杂一些,但无关紧要。假如你在这些语句中加了程序中必须要有的代码
  比如

  ASSERT(pNewObj = new CMyClass);

  pNewObj->MyFunction();

  这种时候Release版本中的pNewObj不会分配到空间

  所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY :

        #ifdef _DEBUG
        #define VERIFY(x) if( (x) == 0) report_assert_failure()
 
 
  #else

        #define VERIFY(x) (x)
        #endif
  这样的话,代码在release版中就可以执行了。

  III.参数问题:

  自定义消息的处理函数,必须定义如下:

  afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);

  返回值必须是HRESULT型,否则Debug会过,而Release出错

  IV.内存分配

  保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。

  V.DLL的灾难

  人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) ,甚至微软自己也这么说(http://msdn.microsoft.com/library/techart/dlldanger1.htm)。如果你的程序使用你自己的DLL时请注意:

  1.不能将debug和release版的DLL混合在一起使用。debug都是debug版,release版都是release版。解决办法是将debug和release的程序分别放在主程序的debug和release目录下
  2.千万不要以为静态连接库会解决问题,那只会使情况更糟糕。

  VI.RELEASE板中的调试:

  1.将ASSERT() 改为 VERIFY() 。找出定义在”#ifdef _DEBUG”中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(…)中代码,因为这些代码在RELEASE中也不被编译。请认真检查那些在RELEASE中需要的代码是否并没有被便宜。

  2.变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。

  3.是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现.

  VII.将Project Settings” 中 “C++/C ” 项目下优化选项改为Disbale(Debug)。编译器的优化可能导致许多意想不到的错误,请参考http://www.pgh.net/~newcomer/debug_release.htm

  1.此外对RELEASE版本的软件也可以进行调试,请做如下改动:

  在”Project Settings” 中 “C++/C ” 项目下设置 “category” 为 “General” 并且将”Debug Info”设置为 “Program Database”。在 “Link”项目下选中”Generate Debug Info”检查框。”Rebuild All” 如此做法会产生的一些限制:无法获得在MFC DLL中的变量的值。必须对该软件所使用的所有DLL工程都进行改动。

  另:

  MS BUG:MS的一份技术文档中表明,在VC5中对于DLL的”Maximize Speed”优化选项并未被完全支持,因此这将会引起内存错误并导致程序崩溃。

  2.www.sysinternals.com有一个程序DebugView,用来捕捉OutputDebugString的输出,运行起来后(估计是自设为system debugger)就可以观看所有程序的OutputDebugString的输出。此后,你可以脱离VC来运行你的程序并观看调试信息。

  3.有一个叫Gimpel Lint的静态代码检查工具,据说比较好用。http://www.gimpel.com/ 不过要化$的。

    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/greatverve/archive/2011/02/15/MFC80D_DLL.html,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108039.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sha1给出了三种新的sha版本_开发版和稳定版哪个好

    sha1给出了三种新的sha版本_开发版和稳定版哪个好在进行百度地图等地图开发时,需要申请一个SHA1,方法流程如下:1.找到文件debug.keystore所在位置,一般在C盘的.android目录下。2.使用jdk自带的keytool工具。3.进入win+r输入cmd进入cmd窗口,进入debug.keystore所在目录,使用keytool工具,示例:C:\Users\SYY\.android>D:\SYYData\.download\IDEA-C\jdks\bin\keytool-list-v-keystoredebug.keys

    2022年8月11日
  • Python 学生信息管理系统——文章中源码100%真实有效—–如何将类、初始化属性、模块、循环判断、静态方法等一系列知识点结合起来做一个项目「建议收藏」

    Python 学生信息管理系统——文章中源码100%真实有效—–如何将类、初始化属性、模块、循环判断、静态方法等一系列知识点结合起来做一个项目「建议收藏」这篇博客主要就是把学生管理系统进行源码分享,这段源码很好的将前面所学的全部串在一起。就我个人而言真的是非常有价值。就算你python前面的基础不好,学完这个系统你会有重获新生的感觉。本文适合需要用python完成课程大作业、python爱好者、python路上的学习者、初学python者、需要将python知识点串在一起的人、上进的人。manageSystem.py#TODO鸟欲高飞,必先展翅#TODO向前的人:Jhon

    2022年8月23日
  • 二叉树的一些性质图解

    二叉树的一些性质图解树的介绍1.树的定义树是一种数据结构,它是由n(n&gt;=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:(01)每个节点有零个或多个子节点;(02)没有父节点的节点称为根节点;(03)每一个非根节点有且只有一个父节点;(04)除了根节点外,每个子节点可以分为多个不相交的子树。 2.树的基本术语若…

    2022年5月20日
  • arcgis二次开发python-ArcGIS 二次开发专题 序「建议收藏」

    arcgis二次开发python-ArcGIS 二次开发专题 序「建议收藏」依据ArcGIS组件式开发及应用的目录结构,将系统性的学习ArcGIS二次开发的道路分为三个部分。这个系列包含以下三个部分:Part1基础1.前言1.1组件式GIS1.2ArcObject开发的特点与历史2.使用ArcGISEngine控件编程3.几何形体对象Geometry4.地图组成5.空间数据符号化6.空间数据管理7.空间分析8.空间数据编辑9.地图输出10…

    2022年7月23日
  • Hostapd简介

    Hostapd简介Hostapd简介hostapd能够使得无线网卡切换为master模式,模拟AP(通常可以认为是路由器)功能,也就是我们说的软AP(SoftAP)。Hostapd的功能就是作为AP的认证服务器,负责控制管理stations(通常可以认为带无线网卡的PC)的接入和认证。通过Hostapd可以将无线网卡切换为AP/Master模式,通过修改配置文件,可以建立一个开放式的(不加…

    2022年5月11日
  • cmd命令怎么切换盘符_windows切换盘符命令

    cmd命令怎么切换盘符_windows切换盘符命令转载于:https://www.cnblogs.com/QMM2008/p/4003039.html

    2022年10月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号