島野です。お世話になります。
現在、NT4.0/VC++5.0 → Win2K/VC++6.0 の移行作業をしています。
(VC++7.0 が出ているご時世なんですけど・・・(^^;;;)
その中で、ひとつ良く分からない事象が出てきたので、
ご意見を伺いたいと思いメールいたしました。
VC++6.0(SP5) の、CComboBox::AddString() 関数についてですが、
UNICODE / Debug バージョンだと落ちる場合があるようです。
再現手順は、
-------------------------------------------------------------
1. MFC AppWizard (exe) で、ダイアログベースのプログラムを作成
2. コンボボックスのリソース(IDcb_Test)を配置
3. リソースのタイプに、大文字変換(CBS_UPPERCASE)を指定
例)
COMBOBOX IDcb_Test,7,7,69,26,CBS_DROPDOWN | CBS_SORT |
CBS_UPPERCASE | WS_VSCROLL | WS_TABSTOP
4. CComboBox の変数として、m_cbTest を追加
5. ダイアログの OnInitDialog() で、コンボボックス(m_cbTest)に
文字リテラルを追加しようとするとkernel32 で、アクセス違反が
発生する。(ただし、定義に _UNICODE を追加した場合のみ発生)
例)
m_cbTest.AddString( _T("aaa") )
6. スタック変数を指定した場合は、問題ないらしい。
例1)
TCHAR szData[] = _T("aaa");
m_cbTest.AddString( szData );
例2)
CString strData = _T("aaa");
m_cbTest.AddString( strData );
-------------------------------------------------------------
といった感じです。
大文字変換(CBS_UPPERCASE)、または、小文字変換(CBS_LOWERCASE)を
指定しなければ落ちません。
また、ANSI バージョン、もしくは、UNICODE / Release バージョンなら
「文字変換」を指定していていも落ちません。
予想では「文字変換」を指定すると「文字リテラル」を書き換えようとして
アクセス違反になっているのでは?と思うのですがヘルプにそのような記述
は見当たりません。
もし、書き換えるような仕様だとしたら、プロトタイプ宣言は、
int AddString( LPCTSTR lpszString ); でなく、
int AddString( LPTSTR lpszString ); になっていると思うのですが・・・。
とりあえずの回避方法としてはスタック変数を指定すれば落ちなくなるので、
それで対応しようと思いますが、何故落ちるのかが分かりません。
どなたか、原因等ご存知の方、いらっしゃいましたらご教授お願いします。
--
現在、NT4.0/VC++5.0 → Win2K/VC++6.0 の移行作業をしています。
(VC++7.0 が出ているご時世なんですけど・・・(^^;;;)
その中で、ひとつ良く分からない事象が出てきたので、
ご意見を伺いたいと思いメールいたしました。
VC++6.0(SP5) の、CComboBox::AddString() 関数についてですが、
UNICODE / Debug バージョンだと落ちる場合があるようです。
再現手順は、
-------------------------------------------------------------
1. MFC AppWizard (exe) で、ダイアログベースのプログラムを作成
2. コンボボックスのリソース(IDcb_Test)を配置
3. リソースのタイプに、大文字変換(CBS_UPPERCASE)を指定
例)
COMBOBOX IDcb_Test,7,7,69,26,CBS_DROPDOWN | CBS_SORT |
CBS_UPPERCASE | WS_VSCROLL | WS_TABSTOP
4. CComboBox の変数として、m_cbTest を追加
5. ダイアログの OnInitDialog() で、コンボボックス(m_cbTest)に
文字リテラルを追加しようとするとkernel32 で、アクセス違反が
発生する。(ただし、定義に _UNICODE を追加した場合のみ発生)
例)
m_cbTest.AddString( _T("aaa") )
6. スタック変数を指定した場合は、問題ないらしい。
例1)
TCHAR szData[] = _T("aaa");
m_cbTest.AddString( szData );
例2)
CString strData = _T("aaa");
m_cbTest.AddString( strData );
-------------------------------------------------------------
といった感じです。
大文字変換(CBS_UPPERCASE)、または、小文字変換(CBS_LOWERCASE)を
指定しなければ落ちません。
また、ANSI バージョン、もしくは、UNICODE / Release バージョンなら
「文字変換」を指定していていも落ちません。
予想では「文字変換」を指定すると「文字リテラル」を書き換えようとして
アクセス違反になっているのでは?と思うのですがヘルプにそのような記述
は見当たりません。
もし、書き換えるような仕様だとしたら、プロトタイプ宣言は、
int AddString( LPCTSTR lpszString ); でなく、
int AddString( LPTSTR lpszString ); になっていると思うのですが・・・。
とりあえずの回避方法としてはスタック変数を指定すれば落ちなくなるので、
それで対応しようと思いますが、何故落ちるのかが分かりません。
どなたか、原因等ご存知の方、いらっしゃいましたらご教授お願いします。
--