ご無沙汰です。

DirectShow Ver 1.0を仕上げてから、矢張り習作ではなく一応実用にしたいと使い勝手の改善とプレイリストによる再生の追加を行っていて怪談に会いました。

 

1.背景

ウィンドウズソフトはツールバーやステータスバーを付けてユーザーインターフェースを充実させることができます。過去のBCCForm and BCCSkeltonでも、例えばBCCMaker等、多くのソフトがツールバー、ステータスバーを実装していました。特にステータスバーはその方法がとても簡単です。

(1)ステータスバーのウィンドウスタイルに"SBT_TOOLTIPS"を加える。その為には"#define        SBT_TOOLTIPS        0x0800"を追加する。

(2)WM_CREATEメッセージでは、ユーザー指定の区画数と初期表示文字列に基づきSkeltonWizardがステータスバー作成のコードを作るので、ユーザーはステータスバーの区画幅だけ修正する。

<例-問題となる今回のコード>

    //ステータスバー登録-SetHandle(hWnd))
    m_SBar.SetHandle(GetDlgItem(m_hWnd, IDC_STATUSBAR));
    //ステータスバー区画設定
    int sec[2] = {100, -1};
    m_SBar.SetSection(2, sec);
    //ステータスバー文字列設定
    m_SBar.SetText(0, "FileList Ver 1.0");
    m_SBar.SetText(1, "プレイリストファイル名(*.plf)");
勿論ユーザーが紫字部分のコードをいじって修正することもできます。

(3)後は、必要に応じてステータスバーの表示を変更する際に、ウィンドウサイズの変更等で表示文字が完全に表示できない場合、ツールチップを付けます。

<例-問題となる今回のコード>

    m_SBar.SetText(1, g_File.ToChar());        //ステータスバーにフルパス名表示
    m_SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_File.ToChar());    //ToolTipをつける

ちょっと説明すると、m_SBarはステータスバーをカプセル化するCSBARクラスのインスタンスで、メンバー関数(メソッド)として区画に文字列を書き込む"SetText(int 区画指定、char* 文字列)"と"SendMessage(m_SBar.m_hWnd(ステータスバーのウィンドウハンドル), SB_SETTIPTEXT, (WPARAM)区画指定, (LPARAM)文字列)"と等価なSendMsg(SB_SETTIPTEXT, (WPARAM)区画指定, (LPARAM)文字列)を使っています。

 

2.問題

いつもと同じように上記のコードを記載し、(特別な処理が無いので)BCC5.5のbcc32でコンパイルすると、ステータスバーの区画1の文字が"U駆SVW▯急♠~"といういかにも文字化け(おそらくシステム領域を指しているから)表示が出ます。試しにBCC102のbcc32cでコンパイルすると暴走して落ちます。

この症状はコンスタンスで、毎回完全に再現できるので偶発要因の関与ではないと判断できます。

 

3.原因追及

今までのプログラムで正常に作動していたものが今回異常なのは、今回のプログラムの特異性に由来する可能性があるので、それを考えます。

(1)メイヌィンドウがダイアログ

DirectShowのようなSDIウィンドウと異なり、今回はモーダルダイアログベースでつくっていますが、それとステータスバーとはリモートと考えられます。事実同じ設定のBCCMakerでは全く問題がありません。

(2)コード記述ミス

これも何度も見直しましたが、もともと他のプログラムからのコピペなので間違えようはずもありません。

(3)LPARAM引数のCSTR変数の異常値

これも一応考えましたが、直前のSetText関数で正常にステータスバーの区画1に表示されていますし、直後にMessageBoxを置いて確認しても何ら異常値はありませんでした。試しにchar配列(char[] と const char*)でコンパイル実行しましたが、いずれも同じ"U駆SVW▯急♠~"という文字列を表示しました。

(4)問題現象から考える

m_SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_File.ToChar());の実行によりツールチップが出るので、動作(SB_SETTIPTEXT)としては正常です。問題は正常なLPARAM引数がツールチップ処理部で参照されず、関係のないアドレスを参照していることです。

 

 

何故なんでしょう?

 

分からない。