<   2005年 09月 ( 14 )   > この月の画像一覧

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

リリースビルドすると、実行後にウインドウが巨大化する

デバッグモードでプログラムを開発してきて、いざリリースでビルドすると問題が発生するというのはよくある話。これもまた、同じような問題。

デバッグ中は無事に動いていたのに、リリースでビルドして実行すると、ウインドウが巨大化してしまう問題が発生した。
ウインドウのサイズを変更する関数 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()です。)

リリースビルドでデバッグ情報が出せると、現地でのデバッグとかに便利です。
ログファイルに出力すると、溜まりに貯まって肥大化したり、増えすぎたログファイルをどうするかという問題もありますし、ログファイルの切り捨てとか、保存場所とか、悩みは尽きません。
デバッグ出力だと、問題が発生したときに、ピンポイントで情報を取り出すことができますので便利です。
忙しい関数に仕掛けると、パフォーマンスに影響しますので、注意。

デバッグ情報は、開発環境の他、SysinternalsDebugView(フリーウェア)でみれます。


... 前にも同じ問題にぶち当たったっけ。。。(^^;)
ウインドウの巨大化が解決しました。
[PR]
by isoq | 2005-09-30 16:03 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

やっと解決!VCのCL.EXEが止まっちゃう(ハングアップ)問題

とうとう解決しました。
どうやら、CPUに原因があったみたいです。

(追記:うそでした。本当の理由は→何回解決すれば終わるんだ!?またまた解決!CL.EXEのフリーズ問題 を参照のこと。)

DELLのPrecision530を使用しているのですが、XEON2GHzのデュアルCPUで、HyperThreadingを有効にしてあったので、見かけ上テトラCPUに見えていたのですが、どうやら、そのHTを有効にしていると、CL.EXEが止まってしまうらしい。

HTが正式に出荷される前のCPUで、本当に初期のHTだったため、スケジューリングの問題でもはらんでいるんではなかろうか。

何にせよ、単純デュアルCPUでHTがOFFの状態で、正常にビルドできるようになった。
一件落着。
[PR]
by isoq | 2005-09-27 14:11 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

CL.EXEが固まる問題が解消!

どうやら、環境変数の問題だったみたい。
(追記)↑じゃなかったみたい。
(さらに追記:本当の理由は→何回解決すれば終わるんだ!?またまた解決!CL.EXEのフリーズ問題 を参照のこと。)

環境変数を確認してみると、次のような変数が登録されていた。
INCLUDE=C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\include\
LIB=C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Lib\

怪しいな、、、と思い、コマンドラインから、それらを削除してから、同じコマンドラインからVCを起動して、プロジェクトをビルドしてみた。
>set INCLUDE=
>set LIB=
>"C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE"

すると、まともにコンパイルが通るようになった。(追記)なってなかったみたい。。。(;_;)

コマンドラインから、環境変数を変更しても、システムの大元に登録されている環境変数は変わらない。
これは、環境変数をいろいろごちゃごちゃやってみて、動作の確認したりするには便利。

だから、システムのプロパティから改めて環境変数を変更する必要がある。
システムのプロパティから環境変数を変更しても、すでに動いているソフトやそのソフト(ランチャとか)から起動したソフトは、古い環境変数を使うことになる。
だから、ログオフ/ログオンのやり直しをした方が確実。
ではやってみます。
[PR]
by isoq | 2005-09-27 13:17 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

開発環境・OSを再インストールしたのにCL.EXEが固まる (;_;)


表題の通り。
ビルドを始めるとCL.EXEが固まって、延々と終わらない。
(Research)VisualC++の不思議によると、sp6のインストールで、解決できることがあるらしい。
そういえば、sp6はまだ入れていなかったような。
試してみよ。

→だめだった。。。

アンチウィルスを切っても、だめだし。
どうしたら良いんだ~~~!!
Windows XPのアップデートとかが問題を引き起こしているのかな?
Windows 2000でもインストールするか。。。(;_;)

(追記:本当の理由は→何回解決すれば終わるんだ!?またまた解決!CL.EXEのフリーズ問題 を参照のこと。)
[PR]
by isoq | 2005-09-27 11:52 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Virtual PCの差分HDDイメージって、、、何?いったいどういう意味??

今日は、会社のPCの環境を汚さずに、新しい製品をテストするため、VirtualPC2004を使用した。
以前、WindowsXPをインストールした(直後の)HDDイメージをRAR圧縮してCD-Rに焼いてあったので、それを解凍して使おうと思ったけど、どうせ何度も使うことになるからと、VirtualPC2004が搭載している「差分ディスク」という機能を使うことにした。

もともとOS関連のファイルなんてそうそう変化しないだろうし、また他の用途にも使えるし。
これで、差分だけの容量だから、CDやDVDに書き出して保存しておくのも楽ちんだ。

早速、差分ディスクで起動して、必要なファイルをコピーしてインストールした。
その容量は、apache+perl+web application 全部あわせても100MB程度。
インストール後、HDDイメージのサイズを確認してみると、、、

なんと、1.3ギガバイトッ!!(@@)

あほか、何が差分だ。
1.5GBに+100MBしただけなのに、どう差分をとったら、1.3GBの大容量となってしまうのか。。。謎だ。

(ページングファイルと、System Volume Informationをあわせても、500MBもいかないし、、、 ^^;)
[PR]
by isoq | 2005-09-24 17:18 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

ゴミの足跡=データの穴 on DVD-R

DVDにデータを書き込んで、後から記録面を見てみると、小さなゴミがついていた。
どけると、そこだけ記録されていない様な「跡」がついていた。

びっくりしたけど、データの読み出しチェックをしてみたら、難なく読み出しOK。
どうやら、書き込み中によけてくれたらしい。
ちなみに、Roxio Easy CD and DVD Creator 6 の Drag To Disc のパケットライトで書き込み。
えらいえらい。

ビーズ針金製の紙どめの方のパケットライトは、相変わらずだめですね。
1~2Gのデータを書くのに、必ずブルーバックエラーに遭遇して、メディアをだめにしてくれます。
どうにかならんかな~
[PR]
by isoq | 2005-09-20 19:23 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

8階層以上のディレクトリのCD/DVDを焼いてもOK!

よく、CDを焼くときに、「8階層以上のディレクトリがあるから、環境によってはみれなくなりますよ~」という警告が表示される。
WindowsXPだったら、8階層以上でも読める。
その他の環境では読めないかもしれない。(未確認)
[PR]
by isoq | 2005-09-20 19:15 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

エキブロトップページが寂しくなっているッ!!

いつの間に!こんなに寂しくなっちゃったんだろう?
と思った。
a0002261_1984670.jpg


と思った矢先、JavaScriptがOFFになっているのを発見。
ONにしたら、治りました~ ^^;
びっくり。
[PR]
by isoq | 2005-09-20 19:11 | 日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

我が家もクワガタ

先日、次男が市内の「ババ」の家に遊びに行ったときに、階段の裏に張り付いていたのを発見したそうです。
「ムシキング~~~」
と絶叫したそうです(^^;)
a0002261_10353115.jpg

それから、我が家の一員となりました。
コクワガタです。

臆病者らしく、元気は良いのですが、人が来るとすぐに木の下に隠れてしまいます。
霧吹きをするとき以外は、滅多にお目にかかれません。
昼間は、霧吹きのために木をどかすと、驚きのあまり(?)固まってしまいます(^^;)
死んでしまったのかと、どきどきしながら、つつくと微妙に動くので、ほっとします。

餌だけはがんがん減っていきます。
夜な夜ながっついているのでしょう。
[PR]
by isoq | 2005-09-20 10:39 | 子供のこと
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

不審な自動起動 f23mxins はATI Fire GL2・3・4のインストーラのコンポーネントだった。

WindowsXPの自動起動の中に、不審なのもを発見。

「f23mxins」

Webで検索しても見つからない。

レジストリを調べてみると、どうやら、ATI Fire GL2/Fire GL3などのドライバのコンポーネントらしい。

HKEY_USERS\S-1-5-21-515967899-1390067357-725345543-1004\Software\Microsoft\Windows\ShellNoRoam\MUICache


に以下のエントリーがあった。
C:\WINDOWS\system32\f23mxins.exe=Fire GL series OpenGL graphics driver install

[PR]
by isoq | 2005-09-08 10:11 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇