原文如下(轉自http://yiyunscu.blog.163.com/blog/static/36263320201091010349294/):
這段時間一直在忙項目,也沒有時間來博客把這段時間的東西整理下粘貼上來,只是今天晚上把手上的工作調試完成了,上了博客才決定把今天遇到的問題發上來供大家參考。
今天一天都在編代碼,作調試,到晚上才發現以前的項目中的代碼存在問題,但是以前爲什麼就好好的呢?真是想不通,在調試的過程中,由於主框架程序調用了我自己封裝的一個採集模塊組件,這個組件採用mfc dll封裝成COM的形式進行調用,但是在主框架程序中調用這個模塊老是有問題,在顯示採集模塊窗口界面的時候就出現“Expression Buffer too small"的錯誤提示,搞得非常鬱悶,調試都沒有辦法進行,於是上網查找了下,說可能是CString::Format這個函數出現的問題,於是我仔細的查看了代碼,結果發現在窗口界面的初始化OnInitDialog函數中有下面的這句代碼:
m_strFBL.Format("%s(放大約%d倍)", m_strFBL, m_nfbl / m_nScreenDPI);
Format中的參數爲m_strFBL字符串本身,我估計是Format在內部根據格式化參數列表會對字符串本身的內存空間進行重新分配,而如果直接採用字符串本身作爲參數傳入的話,這個過程中就會造成內存的衝突,而這個衝突是無法預見的,查看了下msdn,微軟也作了相應的註釋:
The call will fail if the string object itself is offered as a parameter to Format. For example, the following code:
CString str = "Some Data";
str.Format("%d%d", str, 123); //Attention: str is also used in the parameter list.
will cause unpredictable results.
所以爲了避免這種無法預見的問題,我們最好不要採取將字符串本身作爲參數作爲Format的參數,可以另外定義一個CString變量:
CString str;
str.Format(Format("%s(放大約%d倍)", m_strFBL, m_nfbl / m_nScreenDPI);
這樣問題就解決了。