Canon DR-M200でモノクロ原稿を読む場合の設定メモ。
Visual Studioの出力ウィンドウに文字を出力する_RPT系関数は便利だが、なぜかTCHAR版が無い。
(_RPT系関数の参考)
仕方ないので、TCHAR版を作ってみた。なお、毎回_CRT_WARNを書くのが面倒だったので入力不要としている。別のものを指定したい場合は、適宜書き換えてください。
TCHAR version of _RPTN functions
これで少し楽ができるようになるはず。
2020/2/23更新:Releaseにて無効化されないミス(ビルドエラー発生)を修正。
Semaphoreの参照カウント数を知るために、カウント数を保持するクラスを作ってみたのだがうまくカウントしてくれない。原因を調べるために、CMultiLockのコードを読んでみたらびっくりした。Unlock()とかはCSyncObjectクラスのUnlock()を呼び出すようになっているのに。Lock()は直接Win32APIを叩きに行っていて、CSyncObjectのLock()を呼んでいない。そのため、CSemaphoreのLock()をオーバーライドしても意味がない!!!
ちなみにCSingleLockならLock()はちゃんとCSyncObjectのLock()を呼び出しているので安心。
それにしても、どうしてくれよう、この実装・・・。CMultiLockを継承したクラスを作るしかないのか?面倒だなあ。
CEventとCMultiLock::IsLocked()の組み合わせでちょっと悩んだのでメモ。
CSemaphoreオブジェクトAのLock待ち中にAbortできるよう、以下のように組んだ。
悩んだのは、IsLocked()。Microsoftのドキュメントでは"Nonzero if the specified object is locked; otherwise 0." (ロックされている場合は非ゼロ, それ以外はゼロ)を返すと書かれている。ところで、CSignalの場合、SetとResetのどちらがロック状態なのだろう?
Reset状態ではLock()を通過できないのでResetがロック状態だと思ったのだが、テストしてみたらSetがロック状態だった。そのため、AbortがSetされたかどうかを確認するのは、if(IsLocked(0) != FALSE){Abort処理} が正解ぽい。
Visual StudioにてC / C++のプログラミングをする際に、32bit向けと64bit向けでコードを変えたくなる場合がある。切り替え自体は当然#ifdefでやるのだが、どの定数で判定するのが良いのだろうか?以下、整理してみた。情報ソースはマイクロソフトの以下記事。
Visual Studioのリソースエディタで、ダイアログのクラスを追加しようとして「クラスの追加」を選び必要事項を入力したら、「クラスが登録されていません」というエラーがでてしまった。
直接の原因はわからないが、適切なプロジェクトをスタートアッププロジェクトに設定したら治った。ちなみに、英語環境だと以下のエラーになる。