2005年12月アーカイブ

Windowsプログラミングの罠

ついうっかり罠にはまってしまった。
ウィンドウズではイベントで関数が呼び出されるので、関数の処理される順番が必ず期待通りになるとは限らないという罠。
具体的にはOnInitDialog() よりもOnEnChangeEdit() が実行されうるということと、実行順序は Debug と Release で同一とは限らないということ。
単純に考えると、OnInitDialog() がまず実行され、その後エディットボックスに何か入力されればその都度 OnEnChangeEdit() が呼び出されそうである。
そこで、


BOOL someDlg::OnInitDialog()
{
SetDlgItemInt(IDC_EDIT1, m_foo);
}

void someDlg::OnEnChangeEdit()
{
m_foo = GetDlgItemInt(IDC_EDIT1);
}


とうかつに書いたりすると初めに OnEnChangeEdit() が実行されてで m_foo が0になってしまい、OnInitDialog() でえでぃとっボックスに初期値を表示させようとしても実現できない。

someDlg::someDlg() { m_init = false; }

BOOL someDlg::OnInitDialog()
{
SetDlgItemInt(IDC_EDIT1, m_foo);
m_init = true;
}

void someDlg::OnEnChangeEdit()
{
if (!m_init) return;
m_foo = GetDlgItemInt(IDC_EDIT1);
}

とでもしてこの罠を回避する必要がある。 MFC のDDX 使っていれば気にする必要のないことなんだろうけどATL/WTL を使おうとすると要注意かもしれない。

同じにならない不思議

vs.NET2003で同じソースから msi (ウィンドウズインストーラ)ファイルを2台のマシンで作ってみた。
入力がが同じで処理するソフトが同じなら、出力も同じになっていると思っていたがそうではなかった。
1台のマシンはWindowsXP pro、もう1台はWindows2000 pro。入力になるプロジェクト(ソリューションというのか)はまったく同一で、1台からもう1台へコピーしたもの。
まず、それぞれのコンパイルされた複数の EXE のファイルサイズは同一だった。
しかしそれをまとめたインストーラの MSI ファイルは何故かWinXPで生成されたもののほうが5.8Mだったのに対しWin2000のほうは6.6Mになっていた。
なにが原因だろう?

VisualStudio でソースを編集していたところ何かのはずみでキーボードの入力モードが変わってしまった。
コードをコメントアウトしたくて // と入力しようとすると、 半角の メメ と出てきてしまう。
あせった、うちのキーボードはすべて 101タイプだ。 カナロックに相当するキーがない。
知らなかった。101 でも半角カナが打てたのね。
いや、感心してる場合じゃない。これでは仕事にならん。
急いでネットで調べてみた。
なんとなくそれっぽいテキストを見つけたので試してみる。
Shift + Ctrl + CapsLock
で、直りました。

ちなみに他のキーボードではカナ直接入力は以下のキーを押すらしい。
NEC PC9800 シリーズ、東芝 カナ キー
106 日本語 Ctrl + Shift + カタカナ ひらがな キー
106 日本語(Ctrl + 英数) Ctrl + 英数 キー
101 英語 Shift + Ctrl + CapsLock キー
IBM PS/55 5576-002/003 Ctrl + 漢字 カタカナ キー
IBM PS/55 5576-001 Ctrl + カタカナ キー
AX 日本語 Ctrl + Shift + 英数カナ キー

いい お勉強になりました。

連絡先

nakanohito