MFC80.DLL复制到程序目录中,也有的说复制到安装目录中

在用VS2005学习C++调试程序的时候,按F5键,总提示这个问题,

不晓得什么原因,网上有的说找到MFC80.DLL复制到程序目录中,也有的说复制到安装目录中,可结果很失望,也有的VS2005安装有问题,系统有问题等等。最后还是用以下方法解决了:

在“启动调试F5”的工具图标右侧有一栏“解决方案配置”,将其中的“Debug”改为“Release”,

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/ 不过要化$的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/388560.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/388560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs显示堆栈数据分析_什么是“数据分析堆栈”?

vs显示堆栈数据分析A poor craftsman blames his tools. But if all you have is a hammer, everything looks like a nail.一个可怜的工匠责怪他的工具。 但是&#xff0c;如果您只有一把锤子&#xff0c;那么一切看起来都像钉子。 It’s common for web developers or databa…

服务器

服务器主流品牌&#xff1a;华为、浪潮、戴尔、惠普华为服务器&#xff1a;华为FusionServer RH2288 V3 华为FusionServer RH5885 V3 浪潮服务器&#xff1a; 浪潮英信NP3020M4 浪潮英信NF5280M4 戴尔服务器&#xff1a; 戴尔PowerEdge R730 机架式服务器 戴尔PowerEdge R740 机…

树莓派 zero linux,树莓派 zero基本调试

回家之前就从网上购买了一堆设备&#xff0c;回去也不能闲着&#xff0c;可以利用家里相对齐全的准备安装调试。结果人还没回来&#xff0c;东西先到了。购买的核心装备是树莓派zero w&#xff0c;虽然已经知道它比家族大哥树莓派小不少&#xff0c;但拿到手里还是惊奇它的小巧…

error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thiscall

error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thiscall CWnd )(WPARAM,LPARAM)” 不能转换void (_thiscall CMainFrame::*)(void)to LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)开发平台由VC6.0升级至VS2005&#xff0c;需要…

简单的编译流程

简易编译器流程图: 一个典型的编译器&#xff0c;可以包含为一个前端&#xff0c;一个后端。前端接收源程序产生一个中间表示&#xff0c;后端接收中间表示继续生成一个目标程序。所以&#xff0c;前端处理的是跟源语言有关的属性&#xff0c;后端处理跟目标机器有关的属性。 复…

广告投手_测量投手隐藏自己的音高的程度

广告投手As the baseball community has recently seen with the Astros 2017 cheating scandal, knowing what pitch is being thrown gives batters a game-breaking advantage. However, unless you have an intricate system of cameras and trash cans set up, knowing wh…

linux事务隔离级别,事务的隔离级别(Transaction isolation levels)2

READ COMMITTEDREAD COMMITTED这是数据库默认的隔离级别。它能保证你不能读取那张表格数据&#xff0c;只要有其它事务还在改变这张表格数据。可是&#xff0c;因为sql server在select操作的时&#xff0c;锁表格时间就那么一小会儿&#xff0c;如果一个事务在READ COMMITTED级…

Asp导出到Excel之二

response.contentType "application/vnd.ms-excel" response.addheader "Content-Disposition", "attachment; filename引出文件.xls" 一、适用于动态和表态表。 二、页面最好只存放数据表&#xff0c;不要有其它内容。 三、对于分页的情…

warning C4996: “strcpy”被声明为否决的解决办法

VC2005中&#xff0c;使用了很多标准的C函数&#xff0c;比如fopen&#xff0c;strcpy之类的。编译时会出现警告&#xff0c;比如这个&#xff1a; d:\xxxx.c(1893) : warning C4996: “strcpy”被声明为否决的 紧接着IDE有提示说:“This function or variable…

验证部分表单是否重复

1. 效果 图片中的名称、机构编码需要进行重复验证2. 思路及实现 表单验证在获取数据将需要验证的表单数据进行保存this.nameChangeTemp response.data.orgName;this.codeChangeTemp response.data.orgCode; 通过rule对表单进行验证 以名字的验证为例rules: {orgName: [// 设置…

python bokeh_提升视觉效果:使用Python和Bokeh制作交互式地图

python bokehLet’s face it, fellow data scientists: our clients LOVE dashboards. Why wouldn’t they? Visualizing our data helps us tell a story. Visualization turns thousands of rows of data into a compelling and beautiful narrative. In fact, dashboard vi…

用C#写 四舍五入函数(原理版)

doubled 0.06576523;inti (int)(d/0.01);//0.01决定了精度 doubledd (double)i/100;//还原 if(d-dd>0.005)dd0.01;//四舍五入 MessageBox.Show((dd*100).ToString()"%");//7%,dd*100就变成百分的前面那一部分了

C++设计UDP协议通讯示例

UDP是一种面向非连接&#xff0c;不可靠的通讯协议&#xff0c;相对于TCP来说&#xff0c;虽然可靠性不及&#xff0c;但传输效率较高   一、绪言   UDP是一种面向非连接&#xff0c;不可靠的通讯协议&#xff0c;相对于TCP来说&#xff0c;虽然可靠性不及&#xff0c;但…

浪里个浪 FZU - 2261

TonyY是一个喜欢到处浪的男人&#xff0c;他的梦想是带着兰兰姐姐浪遍天朝的各个角落&#xff0c;不过在此之前&#xff0c;他需要做好规划。 现在他的手上有一份天朝地图&#xff0c;上面有n个城市&#xff0c;m条交通路径&#xff0c;每条交通路径都是单行道。他已经预先规划…

C#设计模式(9)——装饰者模式(Decorator Pattern)

一、引言 在软件开发中&#xff0c;我们经常想要对一类对象添加不同的功能&#xff0c;例如要给手机添加贴膜&#xff0c;手机挂件&#xff0c;手机外壳等&#xff0c;如果此时利用继承来实现的话&#xff0c;就需要定义无数的类&#xff0c;如StickerPhone&#xff08;贴膜是手…

北大青鸟c语言课后答案,北大青鸟C语言教程--第一章 C语言基础.ppt

《北大青鸟C语言教程--第一章 C语言基础.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《北大青鸟C语言教程--第一章 C语言基础.ppt(20页珍藏版)》请在人人文库网上搜索。1、第一章,C 语言基础,2,课程地位,.Net ,以 # 开始的语句称为预处理器指令,#include语句不…

nosql_探索NoSQL系列

nosql数据科学 (Data Science) Knowledge on NoSQL databases seems to be an increasing requirement in data science applications, yet, the taxonomy is so diverse and problem-centered that it can be a challenge to grasp them. This post attempts to shed light on…

C++TCP和UDP属于传输层协议

TCP和UDP属于传输层协议。其中TCP提供IP环境下的数据可靠传输&#xff0c;它事先为要发送的数据开辟好连接通道&#xff08;三次握手&#xff09;&#xff0c;然后再进行数据发送&#xff1b;而UDP则不为IP提供可靠性&#xff0c;一般用于实时的视频流传输&#xff0c;像rtp、r…

程序员如何利用空闲时间挣零花钱

一&#xff1a; 私活 作为一名程序员&#xff0c;在上班之余&#xff0c;我们有大把的时间&#xff0c;不能浪费&#xff0c;这些时间其实都是可以用来挖掘自己潜在的创造力&#xff0c;今天要讨论的话题就是&#xff0c;程序员如何利用空余时间挣零花钱&#xff1f;比如说周末…

编写程序乘法口诀表C语言,陈广川问:c语言编程九九乘法口诀表 怎样用c语言写九九乘法口诀表?...

怎样用c语言写九九乘法口诀表&#xff1f;哈哈&#xff0c;我刚刚用javascript写好乘法口诀表。C语言&#xff0c;如何编写程序输出九九乘法表。形式如下 ********* ******** ******* ****** ***** **** *** ** *&#xff1f;两个循环&#xff0c;一般用for循环 一个循环控制行…