2012-01-12 84 views
1

我有一個簡單的對話框,其中包含新的MFC瀏覽編輯控件。該控件使用成員變量嚮導鏈接到'CMFCEditBrowseCtrl m_edit'。嚮導生成的映射看起來很好。VS2010,MFCEditBrowseControl堆崩潰

在首次運行時,編輯控制被填充有中國類型的字符或有時問號,然後崩潰或者當瀏覽按鈕第一次按下,或者一旦一個文件已被選擇。

該應用程序崩潰與堆損壞失敗。

當我創建一個新的測試項目並執行相同的步驟時,所有工作都正常 - 只有當我嘗試在更大的較舊項目中實現瀏覽編輯控件並且升級歷史約爲VS2003 - > VS2005時, > VS2008 - > VS2010。

沒有什麼古怪的代碼,我懷疑它可能有一些做項目的清單或一些其它的初始化指令/衝突。我已經複製並粘貼了測試項目中的CWinApp :: InitInstance代碼,希望這可能會揭示某些內容,但行爲仍然相同。

任何想法?

回答

0

我想這是因爲一個錯誤導致它假定送入CMFCEditBrowseCtrl任何文本使用Unicode字符編碼。因此,經常使用ASCII(字符編碼=「未設置」或只是在項目設置中爲空的舊項目)將失敗。

我遇到相同的行爲,現在,可以解決它通過與這樣的代碼:ctrl.SetWindowText((LPTSTR)(LPCWSTR)CStringW(strvar));

這迫使一個Unicode字符串到控制,文本突然顯示正常。

不過,我再拿到在垃圾收集堆損壞錯誤。我認爲這是因爲它現在試圖釋放該字符串,這次可能是ASCII而不是Unicode。

所以我不知道有什麼辦法在這裏奪冠,除非你的項目轉換爲Unicode。對於一箇舊的大型項目,這可能會相當耗時。

更新:以下是來自Microsoft Connect的信息:Bug 641662。顯然,這種行爲是按設計的,因爲COMCTL v6是僅Unicode的,並且這是COMCTL v6控件。

+0

我與更新Microsoft Connect上的進一步信息此評論。不幸的是,將項目轉換爲Unicode的唯一解決方案仍然存在。 – Jonas 2012-12-18 12:06:56

+0

經過一些進一步的調查,就在我放棄依賴此控件的代碼時,我注意到一種解決方法可能不是將CMFCBrowseEditCtrl直接放置在對話框中,而是放置一個CEdit控件!然後在頭文件中,用CMFCBrowseEditCtrl替換控件的成員可檢索類型CEdit。我發現這個工作,因爲我發現一些舊的代碼也使用這種控制,運作良好。 – Jonas 2012-12-18 14:03:58

1

經過一些進一步的調查,我放棄了依賴於此控件的代碼,我注意到一種解決方法可能不是將CMFCBrowseEditCtrl直接放置在對話框中,而是放置一個CEdit控件!然後在頭文件中,用CMFCBrowseEditCtrl替換控件的成員可檢索類型CEdit。我發現這個工作,因爲我發現了一些舊的代碼也是用這個控件,它運作良好 工作對我來說也是如此。>大段引用

+0

謝謝,我會盡快嘗試,並讓你知道它是否有效。 – nspire 2016-08-10 05:36:28