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
英文地址,請注明出處:http://en.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循環 一個循環控制行…