1

我有一个简单的对话框,其中包含新的 MFC 浏览编辑控件。该控件使用成员变量向导链接到“CMFCEditBrowseCtrl m_edit”。向导生成的映射看起来不错。

在第一次运行时,编辑控件会填充中文字符或问号,然后在第一次按下浏览按钮或选择文件时崩溃。

该应用程序因堆损坏失败而崩溃。

当我创建一个新的测试项目并执行相同的步骤时,一切正常 - 仅当我尝试在具有大约 VS2003 -> VS2005 -> VS2008 -> 升级历史的较大旧项目中实现浏览编辑控件时才会出现问题VS2010。

代码没有什么奇怪的,我怀疑它可能与项目清单或其他一些初始化指令/冲突有关。我已经从测试项目中复制并粘贴了 CWinApp::InitInstance 代码,希望这可能会揭示一些东西,但行为仍然相同。

有任何想法吗?

4

2 回答 2

1

经过一些进一步的调查,就在我放弃依赖此控件的代码时,我注意到一种解决方法可能不是直接在对话框中放置 CMFCBrowseEditCtrl,而是放置一个 CEdit 控件!然后在头文件中,将控件的成员veriable type CEdit替换为CMFCBrowseEditCtrl。我发现这很有效,因为我发现一些旧代码也使用此控件,这对我也很有效。> Blockquote

于 2016-08-08T23:32:23.717 回答
0

我认为这是因为一个错误导致它假定输入 CMFCEditBrowseCtrl 的任何文本都使用 Unicode 字符编码。因此,经常使用 ASCII(字符编码 =“未设置”或在项目设置中简单地为空)的旧项目将失败。

我现在正在经历同样的行为,可以通过以下代码解决它:ctrl.SetWindowText((LPTSTR)(LPCWSTR)CStringW(strvar));

这会强制将 Unicode 字符串输入控件,并且文本会突然正确显示。

但是,我在垃圾收集时收到堆损坏错误。我认为这是因为它现在尝试释放该字符串,这次可能是 ASCII 而不是 Unicode。

所以我不确定有什么方法可以在这里取胜,除了将你的项目转换为 Unicode。对于一个古老的大型项目来说,这可能相当耗时。

更新:以下是来自 Microsoft Connect 的相关信息:错误 641662。显然,这种行为是按设计的,因为 COMCTL v6 仅是 Unicode,这是一个 COMCTL v6 控件。

于 2012-12-03T21:49:31.507 回答