デバッグモードでプログラムを開発してきて、いざリリースでビルドすると問題が発生するというのはよくある話。これもまた、同じような問題。
デバッグ中は無事に動いていたのに、リリースでビルドして実行すると、ウインドウが巨大化してしまう問題が発生した。 ウインドウのサイズを変更する関数 SetWindowPos() などを使った覚えがないので、ものすごく不思議な現象だった。 よくよく確認すると、原因は、WM_GETMINMAXINFO メッセージを処理する OnGetMinMaxInfo() 関数にあることがわかった。 処理は、OnInitDialog() 中で、初期状態のウインドウサイズを取得して、OnGetMinMaxInfo() にて、そのサイズ以下に縮まらないようにすること。 デバッグモードでは、うまく動いていた(様に見えた)が、リリースモードでは、OnInitDialog() で取得したウインドウサイズが入ったCRectには、デバッグモードの時と全く異なった大きなデータが入っていて、それが原因でウインドウの初期化時の最小ウインドウサイズが巨大になってしまった。 これは、ウインドウの初期化関数OnInitDialog() が呼ばれる前に OnGetMinMaxInfo() 関数が呼ばれてしまうために起こる現象。 1回目のOnGetMinMaxInfo()の呼び出しでは、初期化前のCRectを使ってしまっていた。 デバッグモードでは、変数の初期化時(メモリ割り当て時)に、変な値で上書きしてしまう。 これは、使用しているメモリ領域と、使用していないメモリ領域を判別するためのデバッグのための機能だと思われるけど、それが原因で、リリースモードで問題を起こすことは結構よくある。 リリースモードだと、初期化されないので、どんなデータが入っているのかは実行してみないとわからない。 そこで、簡単なフラグを設定して、初期化前にはウインドウサイズを制限しないように修正したところ、問題が解消した。 void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { dprintf("GetMinMaxInfo() called!\n"); if(m_bInitialized) { lpMMI->ptMinTrackSize.x = _rctOriginal.Width(); lpMMI->ptMinTrackSize.y = _rctOriginal.Height(); } } デバッグモードとリリースモードでは、微妙な違いがあるので注意が必要です。 dprintf() 関数は、デバッグプリントを行うための自作関数。 (というか、実は或曰-- 2001年9月分 -- から拝借 ^^;) void dprintf(char *format, ...) { va_list vl; char buff[1024]; DWORD err = GetLastError(); { va_start(vl, format); _vsnprintf(buff, sizeof(buff), format, vl); va_end(vl); OutputDebugString(buff); } SetLastError(err); } リリースビルドでも、TRACE() のように、printf() の構文でデバッグウインドウにメッセージを送れるようになります。(実際にそれをやっているのはOutputDebugString()です。) リリースビルドでデバッグ情報が出せると、現地でのデバッグとかに便利です。 ログファイルに出力すると、溜まりに貯まって肥大化したり、増えすぎたログファイルをどうするかという問題もありますし、ログファイルの切り捨てとか、保存場所とか、悩みは尽きません。 デバッグ出力だと、問題が発生したときに、ピンポイントで情報を取り出すことができますので便利です。 忙しい関数に仕掛けると、パフォーマンスに影響しますので、注意。 デバッグ情報は、開発環境の他、SysinternalsのDebugView(フリーウェア)でみれます。 ... 前にも同じ問題にぶち当たったっけ。。。(^^;) ウインドウの巨大化が解決しました。
by isoq
| 2005-09-30 16:03
| C/C++/Win32
|
PR
検索
最新の記事
カテゴリ
全体 開発日記 コンピュータ C/C++/Win32 Ubuntu / Linux Web データベース 3Dグラフィックス スクリプティング 書籍 - 技術系 フリーウェア モバイル 日記 子供のこと 旅行日記 観察日記 グルメ 写真館 天体観測 ショッピング アートワーク ヘルスケア 携帯からの投稿 誤変換検索 趣味 Windows 未分類 タグ
Windows 7
海外
旅行
C++
ドイツ
Windows
Aspire 1410
MFC
ボストン
OpenGL
出張
42Z9000
CUDA
GPGPU
REGZA
お買い得
天体望遠鏡
NaiNai
XPモード
グルメ
最新のトラックバック
以前の記事
2022年 03月 2020年 05月 2020年 04月 2020年 03月 2018年 05月 2016年 02月 2015年 04月 2015年 03月 2013年 10月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 03月 2011年 02月 2011年 01月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 11月 2009年 10月 2009年 09月 2009年 08月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 10月 2007年 09月 2007年 08月 2007年 07月 2007年 06月 2007年 05月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 12月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 2006年 06月 2006年 05月 2006年 04月 2006年 03月 2006年 02月 2006年 01月 2005年 12月 2005年 11月 2005年 10月 2005年 09月 2005年 08月 2005年 07月 2005年 06月 2005年 05月 2005年 04月 2005年 03月 2005年 02月 2005年 01月 2004年 12月 2004年 11月 2004年 10月 2004年 09月 2004年 08月 2004年 07月 2004年 06月 2004年 05月 2004年 04月 2004年 03月 2004年 02月 2001年 01月 その他のジャンル
記事ランキング
ブログジャンル
画像一覧
フォロー中のブログ
外部リンク
|
ファン申請 |
||