- アプリケーションエラーが発生する不具合が、コードを変更しなくてもビルドする度に再現するか否かが変わってしまう問題が発生した。原因はメモリの不正アクセスで、ビルドするときのソースを置いた場所(絶対パス)がexeの中に保存されることでメモリ配置が代わり、現象の発生有無が変わった模様。 --
- MFCで作られたダイアログをOnInitDialog()で(0, 0)に移動すると、画面中央に表示されてしまう。→MFCによりダイアログが自動的に中央に移動する --
- ダイアログを生成(Create)するとフォーカスが元々持っていたウィンドウから外れてしまう。ダイアログを非表示で生成していても同様。WM_INITDIALOGに対する戻り値がTRUEだと、タブオーダーが一番若いコントロールに自動的にフォーカスを当てているようで、その結果フォーカスを奪ってしまう。WM_INITDIALOGをハンドルしてFALSEを返す必要がある。 --
- 非表示状態のウィンドウに対しても::SetForegroundWindow()が効く。実際に行うと、全ての可視ウィンドウが非アクティブになったように見える。その状態で::GetForegroundWindow()で非表示ウィンドウのハンドルも取得可能。 --
- VC6でシングルトンを設計すると、正しく機能しない場合が合った。→シングルトンの注意点 --
- SendMessageによって送られたメッセージの処理中は、COM呼び出しに失敗する。(例外となる) --
- COMサーバーをSTAにしておくとシングルスレッドで動作するが、外部からのCOM呼び出しはメッセージループを使用することで待たされている状態となる。自身が他のCOMを呼び出している最中でもメッセージループが回るため、処理が再入してくる。STAでも再入については考慮する必要がある。 --
- CFileFindの検索対象パスを生成する際、dir + "\\*.*" とすることがあるが、何らかの原因でdirが空文字列になった場合、ドライブ直下を操作してしまうことになる。(DOSではいきなり \ が書かれたパスはドライブ直下を表すため)ファイルやフォルダを削除するような処理の場合は、最悪OSが起動しなくなる。dir に相当する変数の空文字列チェックは行うこと。 --
- あるクラスのメンバ関数func()内にスタティック変数を定義すると、別々のインスタンスからfunc()を呼び出したとしても同じメモリ領域が使用されるため、互いに影響し合ってしまった。メンバ関数内の変数であっても、あくまで静的変数として考える必要がある。(というか、滅多なことでは静的変数を使わない方がよさそう) --
- 自作コントロールの描画処理を行う際、コントロールにWS_CLIPSIBLINGSスタイルを付けていても、CClientDCでクライアント領域全体のデバイスコンテキストを取得してそれに対して描画を行うと、兄弟ウィンドウの上にも描画してしまう。その場合は自前でクリップ処理を作るか、OnPaint()やOnDraw()にウィザードによって用意されたデバイスコンテキストを使用する必要がある。 --
- _spawn系のCRT関数を、第1引数に _P_NOWAIT を指定して呼び出した場合は、戻り値のプロセスハンドルを呼び出し側で閉じる必要がある。(下位関数では CreateProcess() でプロセスを起動している。) --
- Windows Update後、過去に作ったExcelマクロでオートメーションエラーが発生するものが出てきた。解決策としては、C:\WINDOWS\system32\MSCOMCTL.OCXをレジストリに再登録すればよい。本件は、VBE上で全く関係ないコードがエラー箇所として表示されるので注意。 --
- WS_CHILD と WS_EX_APPWINDOW スタイルを併用したダイアログは、上に別のウィンドウを重ねた後の再描画がうまくいかない。 --
- 別アプリをアクティブにしてから戻ってくると、ダイアログ中のタブオーダーが一番若いコントロールにフォーカスが当て直されてしまうことがあった。(設計依存?通常は前にフォーカスがあったコントロールに残るはずだが) --
- VB6ではif条件をAndで複数記述していた場合、最初の条件評価でFalseであっても次の条件評価を行ってしまう --
- ヘッダファイル内で名前空間の使用宣言(using)を書いてしまうと、ヘッダのインクルードの順番によっては、まだ名前空間の定義が行われていないのにusingされてしまい、コンパイルエラーになってしまう。 --
- fopen()に渡すファイルパスは、¥マークが連続していても強制的に1つと見なして読み込めてしまう。「C:\\\test.txt」→「C:\test.txt」 --
- scanf("%d", &data); というコードで、data が short型 だとバッファオーバランしてしまう。short型の場合は "%d" ではなく "%hd" とする。printf()とは違い、明確にフォーマットを指定しないといけない。 --
- ダイアログを作成しても表示されたりされなかったりという現象が発生。CWnd::FromHandle()を使用して取得したCWnd*ポインタは一時的にしか使用してはいけないが、メンバ変数に保持し、別のタイミングでダイアログを作成するための親ウィンドウに指定してしまっていた。 --
- コントロール等にフォントを設定するときに用いたCFontオブジェクトは、ダイアログクラスのメンバ変数に保存するなどして勝手に破棄されないようにしておく必要があった。 --
- リッチエディットで文字色を変更するために CRichEditCtrl::SetSelectionCharFormat() をコールする際のCHARFORMAT型の引数の指定に不明点あり。色の変更のみ行うため、dwMask に CFM_COLORを設定し、crTextColorに色を設定したが、色が変更されない。その後いろいろ試した結果、dwEffects に何らかの値が入っていないと色が正しく設定されないようである。バグ?仕様? --
- MFC継承クラスをさらに継承した自作クラスは、VCのウィザードでメッセージのハンドラ等を追加できない。VCの仕様ぽい。手動でメッセージディスパッチ等を追加したら実装可能だった。 --
- 親ウィンドウに子ウィンドウを貼り付けて表示するツールで、親ウィンドウ側に子ウィンドウを再描画させるボタンを用意した(処理はInvalidateRectとUpdateWindow)が、うまく動作しなかった。原因はボタンを押した瞬間に子ウィンドウが非アクティブになってしまい、再描画が即時に行われなかったことだと思われる。 --
- CWnd::OnLButtonUp()やCWnd::OnLButtonDown()に渡されるマウスカーソルの位置はクライアント座標系なのに、CWnd::OnMouseWheel()に渡されるそれはスクリーン座標系のようだ。 --
- HWND_BROADCASTによるブロードキャストメッセージをPreTranslateMessage()で受信できなかった。ON_REGISTERED_MESSAGEを使用したメッセージハンドラなら受信できた。 --
- あるスタティックコントロールをCStaticの継承クラスCStaticExを利用してサブクラス化していたが、なぜかフォーカスを当ててもOnSetFocus()がコールされない。原因は、フォーカスが当たる瞬間はCStaticExクラスのオブジェクトが一時的にdeleteされており、サブクラス化されていない状態となっていたため、イベントをスルーしていた。 --
- 既にフォーカスを持つ子ウィンドウ'A'に対して再度SetFocus()をコールしても、WM_SETFOCUSは送信されない。ただし、'A'の親ウィンドウに対してSetFocus()すると、結果的に'A'にWM_SETFOCUSが送信される。 --
- ::RemoveDirectory()は、カレントディレクトリの削除に失敗する。 --
- EXE形式のCOMサーバーにVC6のウィザードを使用してメソッドを追加すると、自動挿入されるコードが間違っている。 --