2012-01-12 9 views
1

新しいMFCブラウズ編集コントロールを含む簡単なダイアログがあります。コントロールは、メンバー変数ウィザードを使用して 'CMFCEditBrowseCtrl m_edit'にリンクされました。ウィザードで生成されたマッピングはうまくいくようです。VS2010、MFCEditBrowseControlヒープクラッシュ

最初に実行すると、編集コントロールに中国語の文字または疑問符が入力され、ブラウズボタンが最初に押されたとき、またはファイルが選択されるとすぐにクラッシュします。

アプリがヒープの破損に失敗してクラッシュします。

新しいテストプロジェクトを作成して同じ手順を実行すると、すべて正常に動作します - 問題はVS2003 - > VS2005のアップグレード履歴を持つより大きな古いプロジェクトでブラウズ編集コントロールを実装しようとすると発生します。 > VS2008 - > VS2010。

コードには奇妙なことは何もなく、プロジェクトマニフェストや他のinit命令/競合と関係している可能性があります。 CWinApp :: InitInstanceコードをコピーして貼り付けて、テストプロジェクトから何かを明らかにする可能性があることを期待していますが、動作は変わりません。

アイデア?

答えて

0

これは、バグにより、CMFCEditBrowseCtrlに入力されたテキストがUnicode文字エンコーディングを使用していると想定するためです。したがって、ASCIIを使用する古いプロジェクト(文字エンコーディング= "設定しない"または単にプロジェクト設定では空白)は失敗します。

私は今、同じ動作を経験していて、このようなコードを持つことによってそれを回避することができます:ctrl.SetWindowText((LPTSTR)(LPCWSTR)CStringW(strvar));

これはコントロールにUnicode文字列を強制的に、そしてテキストが突然正常に表示されます。

ただし、ガベージコレクションでヒープ破損エラーが発生します。今回は、この文字列を、今度はUnicodeではなくASCIIとして解放しようとしているからです。

プロジェクトをUnicodeに変換することを除いて、ここで勝つ方法はないと思います。これは、古い、大規模なプロジェクトではかなり時間がかかる可能性があります。

更新:これはMicrosoft Connectの情報です:Bug 641662です。 COMCTL v6はUnicodeのみであり、これはCOMCTL v6コントロールであるため、この動作はデザインごとに明らかです。

+0

Microsoft Connectの詳細については、このコメントを更新しました。残念ながら、プロジェクトをUnicodeに変換する唯一の解決策は残っています。 – Jonas

+0

さらに詳しい調査をしたところ、私はこのコントロールに依存しているコードを放棄していました。私は、ダイアログボックスにCMFCBrowseEditCtrlを直接置き、CEditコントロールを置く代わりに回避策があるかもしれないことに気付きました!ヘッダーファイルで、コントロールのメンバ可能なCEdit型をCMFCBrowseEditCtrlに置き換えます。私はこれが正常に機能したこのコントロールを使っていくつかの古いコードを見つけたので、これがうまくいくことを発見しました。 – Jonas

1

このコントロールに依存している私のコードを放棄していた直後に、ダイアログボックスにCMFCBrowseEditCtrlを直接置き、CEditコントロールを配置する代わりに回避策があるかもしれません。ヘッダーファイルで、コントロールのメンバ可能なCEdit型をCMFCBrowseEditCtrlに置き換えます。 >私はこのコントロールを使っていくつかの古いコードを見つけたので、うまくいきました。ブロック番号

+0

ありがとう、私はこれをすぐに試して、それが動作するかどうかをお知らせします。 – nspire