前に、
【旧bcc32の謎】誰か分かる人はいますか?-解けました m_(_ _)_m
で、次のように書きました。
ps. 実はCSTRクラスに関してはまだ怪談があり、それはある非公開のソフトで「外部変数で宣言したCSTRインスタンスにconst char*文字列を代入すると落ちる」という現象です。それも(そしてそれは真逆で)「bcc32(bcc55)でコンパイルすると正常に動作するのですが、bcc32c(bcc102)でコンパイルすると落ちる」のです。これも原因は不明であり、現在bcc55版だけを使っています。bcc2eccについてもbcc102版だけリリースすることになりそうです。
これも不思議で、MessageBoxで罠をかけて落ちる直前の箇所を調べていって↑のコメントになったのですが、他の箇所でCSTRの初期化や代入を行っても正常動作するので原因がつかめずにいました。その後昔のTurbo Debugger32やWinDbg(x86)デバッガー(注)を(ソースベースでは使えないのでバイナリーベースで)使って調べるも訳が分からず、色々なコードを書いたり消したりしていたら、ツールバーの「?」ボタンに文字が出るようになり、最後は正常にコンパイルできるもbcc32(bcc55)、bcc32c(bcc102)共にコンパイルは正常ですが、起動できない状態に陥りました。
注:このデバッガー経験については別途書きます。
結局この非公開ソフトを全く別の形式で書き直そうとして、ひょんなことからその原因が特定できました。それは、
【(非公開ソフト)Proc.h抜粋】
bool CMyWnd::OnCreate(WPARAM wParam, LPARAM lParam) {
//コモンコントロールの初期化
InitCommonControls();
//ツールバー登録-Init(hWnd, hIinstance, ID, Style)
TBar.Init(m_hWnd, m_hInstance, TOOLBAR, WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS);
//ツールバーボタン用カスタムビットマップ追加
TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 5);
//ツールバーボタン追加
TBBUTTON tbb[5]; //ん? ... ん? ... ん? ... ん?
ZeroMemory(tbb, sizeof(tbb));
tbb[0].iBitmap = TBar.m_id;
tbb[0].fsState = TBSTATE_ENABLED;
tbb[0].fsStyle = TBSTYLE_BUTTON;
tbb[0].idCommand = IDM_EXIT;
tbb[1].fsStyle = TBSTYLE_SEP; //セパレーター
・
・
・
tbb[4].fsStyle = TBSTYLE_SEP; //セパレーター
・
・
・
tbb[6].iBitmap = TBar.m_id + 4;
tbb[6].fsState = TBSTATE_ENABLED;
tbb[6].fsStyle = TBSTYLE_BUTTON;
tbb[6].idCommand = IDM_VERSION;
TBar.AddButtons(7, tbb);
・
・
・
TBBUTTON配列5個分に対して7個分を登録しています。恐らく最初はSkeltonWizardで5つのボタンを並べたのでしょうが、その後セパレーターを入れたくなり、マニュアルでセパレーターを二つ入れたので最後のAddButtonsは5→7に修正したのでしょうが、配列宣言の修正は見落としたことが原因でした。TBBUTTON配列宣言を「7」に修正した後はbcc32(bcc55)、bcc32c(bcc102)共に「コンパイルは正常(このようなエラーは検出してくれないのです)」、ツールバーボタンに訳の分からない文字列が現れることもなくなり、動作も正常となりました。
今回のデバグが難航したのは、
(1)不正コードが「CSTR変数への代入のコード」の箇所に(プログラム実行時に)TBBUTTON二個分侵食して、症状を出したので「現象の発生場所 != 原因」であった為、および
(2)bcc32Cではエラー(プログラム落ち)が発生したのに、bcc32では(当初の段階では)無難なところに配列変数を配置したので正常に動作してしまった為、
かと考えられます。
いずれにせよ、原因不明のバグで気落ちして、テンションが下がっていたので、やっとこれで気分が回復しました。