我有一个包含新MFC浏览编辑控件的简单对话框。使用成员变量向导将控件链接到“CMFCEditBrowseCtrl m_edit”。向导生成的映射似乎很好。
首次运行时,编辑控件会填充中文类型字符或有时会出现问号,然后在第一次按下浏览按钮时或文本被选中后立即崩溃。
应用程序因堆损坏失败而崩溃。
当我创建一个新的测试项目并执行相同的步骤时,一切正常 - 只有当我尝试在大型旧项目中实现浏览编辑控件时才会出现问题,升级历史记录大约为VS2003 - > VS2005 - > VS2008 - > VS2010。
代码没什么奇怪的,我怀疑它可能与项目清单或其他一些初始指令/冲突有关。我已经从测试项目中复制并粘贴了CWinApp :: InitInstance代码,希望这可能会揭示某些内容,但行为仍然是相同的。
有什么想法吗?
答案 0 :(得分:1)
经过一些进一步的调查,我正在放弃依赖于此控件的代码,我注意到一个解决方法可能是将CMFCBrowseEditCtrl直接放在对话框中,放置一个CEdit控件!然后在头文件中,使用CMFCBrowseEditCtrl替换控件的成员可靠类型CEdit。我发现这很有效,因为我发现一些旧的代码也使用了这个控件,效果很好 也为我工作。>块引用
答案 1 :(得分:0)
我认为这是因为一个错误导致它假设输入CMFCEditBrowseCtrl的任何文本都使用Unicode字符编码。因此,经常使用ASCII(字符编码=“未设置”或在项目设置中为空)的旧项目将失败。
我现在遇到了同样的行为,并且可以通过这样的代码解决它:ctrl.SetWindowText((LPTSTR)(LPCWSTR)CStringW(strvar));
这会强制Unicode字符串进入控件,文本会突然显示正确。
然而,我在垃圾收集时遇到堆损坏错误。我认为这是因为它现在试图释放该字符串,这次可能是ASCII而不是Unicode。
所以我不确定除了将项目转换为Unicode之外,还有什么方法可以在这里取胜。对于一个古老的大型项目而言,这可能相当费时。
更新:以下是Microsoft Connect的相关信息:Bug 641662。显然这种行为是按设计进行的,因为COMCTL v6只是Unicode,这是一个COMCTL v6控件。