【问题标题】:VS2010, MFCEditBrowseControl heap crashVS2010,MFCEditBrowseControl 堆崩溃
【发布时间】:2012-01-12 17:37:45
【问题描述】:

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

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: mfc mfc-feature-pack


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我会尽快尝试,如果它有效,请告诉您。
    【解决方案2】:

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

    我现在遇到了同样的行为,可以使用如下代码解决它:ctrl.SetWindowText((LPTSTR)(LPCWSTR)CStringW(strvar));

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

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

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

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

    【讨论】:

    • 我用有关 Microsoft Connect 的更多信息更新了此评论。不幸的是,将项目转换为 Unicode 的唯一解决方案仍然存在。
    • 经过进一步调查,我几乎要放弃依赖此控件的代码,我注意到一种解决方法可能是代替直接在对话框中放置 CMFCBrowseEditCtrl,而是放置一个 CEdit 控件!然后在头文件中,将控件的成员veriable type CEdit替换为CMFCBrowseEditCtrl。我发现这很有效,因为我发现一些旧代码也使用此控件,效果很好。
    猜你喜欢
    • 2013-06-02
    • 2011-10-29
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多