2012-01-12 99 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