ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

Visual Studio

mozjpegをつかった画像変換ソフトの開発 その9 MozJPEG2.3.1->4.1.1

MozJPEGがいつのまにか3.3.1から4.1.1に進化しており、GitHubにて対応要望が出ていた。そこで、開発を再開し4.1.1を適用しようとおもう。できたらいいな。

CSimpleLock::IsLockedの罠

CriticalSectionの取り扱いを楽にするため、MFCのCCriticalSectionとCSimpleLockを使おうとして罠にハマったという話。 CCriticalSectionはCSemaphore等と異なりLock待ちのタイムアウトができない。そのため、ロックできなかったら諦める!という実装が不可…

C++REST (cpprest)をスタティック構成のMFCと一緒に使う

RedmineのデータをREST API経由でダウンロードするプログラムを作るためにcpprestを導入しようとした際に苦労した点のメモ。 前記ソフトをMFCランタイムをダウンロードできない/しづらい環境でも使えるようにするため、MFCをスタティックライブラリとして組…

Factorioでアイテム生産に必要な工場の数を試算するツール(FactorioFactoryCalculator)

Factorioでアイテム生産に必要な工場の数を試算するためのツール, FactorioFactoryCalculatorを公開しました。これを使えば、例えば製造サイエンスパックを毎秒3個作るために必要な、生産力モジュール1の工場の数やそのための発展基板工場の数などが試算でき…

重い処理中にステータス(状態)を表示するダイアログの実装(ユーザーインターフェーススレッド)

解決したい課題 MFCを使ったソフトにおいて重い処理をしている最中に、進捗等を表示するダイアログを表示したくなることは多々ある。しかし、単純にダイアログを作って表示しようとしても、以下のようにうまく行かないことが多い。 重い処理が終わるまでダイ…

ダイアログバー上のエディットボックスから文字列を取得する方法

ダイアログバー上のエディットボックスから文字列を取得するのにちょっと苦労したのでメモ。 問題の背景 ダイアログを作る場合、通常はCDialog等を継承した、そのダイアログ固有のクラスを作成する。しかしMicrosoft曰く、CDialogBarは通常固有のクラスを作…

CDocumentからCViewを取得する一例

今時ドキュメントビューアーキテクチャなんて人は居ないだろうけど、メモ。 CDocumentからCViewにメッセージを投げたいときや関数を直接呼び出したいときに困るのが、CViewのアドレス取得方法。特に、自分はCSplitterWndを多用したためCViewが複数あり決め打…

CArchive::ReadString, CArchive::WriteStringの罠

CArchive::ReadString()とCArchive::WriteString()を使って文字列を読み書きしようとしたら文字化けしてハマったのでメモ。 以下のようなコードを書いたら、読み込み時に文字化けした。 void Serialize(CArchive &ar){ TCHAR path[MAX_PATH+1]; if(ar.IsStor…

リソースエディタがWS_EX_COMPOSITEDを認識しない

とあるリソースをVisual Studio2019で開こうとしたら、error RC2104: undefined keyword or key name: WS_EX_COMPOSITED というエラーが出た。 error RC2104: undefined keyword or key name: WS_EX_COMPOSITED でも、おかしい。このキーワードはWindowsに存…

_RPTN, _RPTWN等をTCHARに対応させる

Visual Studioの出力ウィンドウに文字を出力する_RPT系関数は便利だが、なぜかTCHAR版が無い。 (_RPT系関数の参考) donadona.hatenablog.jp 仕方ないので、TCHAR版を作ってみた。なお、毎回_CRT_WARNを書くのが面倒だったので入力不要としている。別のもの…

CMultiLockの問題

Semaphoreの参照カウント数を知るために、カウント数を保持するクラスを作ってみたのだがうまくカウントしてくれない。原因を調べるために、CMultiLockのコードを読んでみたらびっくりした。Unlock()とかはCSyncObjectクラスのUnlock()を呼び出すようになっ…

Visual Studioのコード上で32bit用コードと64bit用コードを切り替える

Visual StudioにてC / C++のプログラミングをする際に、32bit向けと64bit向けでコードを変えたくなる場合がある。切り替え自体は当然#ifdefでやるのだが、どの定数で判定するのが良いのだろうか?以下、整理してみた。情報ソースはマイクロソフトの以下記事…

Visual Studioでクラスが登録されていませんというエラーが出る

Visual Studioのリソースエディタで、ダイアログのクラスを追加しようとして「クラスの追加」を選び必要事項を入力したら、「クラスが登録されていません」というエラーがでてしまった。 クラスが登録されていません 直接の原因はわからないが、適切なプロジ…

mozjpegをつかった画像変換ソフトの開発 その4

どのようにマルチスレッド化するかを考え中。 考えられる方針は大きく2つ。 ファイルを1個開くたびに1スレッド作り、1変換をするたびに1スレッドを作り、1個書き出すたびに1スレッド作る。ブルジョワ方針。 物理メディアごとに1スレッド作り、当該メディアで…

LibPNGの速度比較(32bit, 64bit)

libPNGについて、win32とx64で速度が違うのか調べてみた。 ■使用環境 OS: Windows10 64bit バージョン1909 CPU:Ryzen 7 3700X 3.6GHz メモリ: PC10700 (1088MHz) ■計測方法 libPNGのRUN_TESTS所要時間を3回計測する。ビルドはいずれもRelease。 ■計測結果 wi…

mozjpegをつかった画像変換ソフトの開発 その3

画像ファイルのロード、変換、保存をする部分の構造はどうしようかなあ。最近のPCはCPUのコア数が多いので、できればマルチスレッド対応としたい。その場合、どういうプログラム構成とすればいいのだろう? データ処理の流れはシンプルだ。 二次記憶からデー…

ツールチップに複数行の文字を表示させる

CToolTipCtrlのAddTool()を使ってツールチップを表示させようとしたときに、文字列が長い場合は指定した位置で改行したくなる・・よね?でも、テキストに\nを加えても改行してくれず、ちょっと苦労したのでメモ。 CToolTipCtrlを使って複数行にわたるテキス…

MFCを使う場合の多言語化

MFCを使う場合の多言語化メモ。以下の英語版より抜粋。 docs.microsoft.com マイクロソフトによると、言語ごとのリソースはリソース専用DLLに格納すればいいらしい。そうすると、以下の順番でリソースの読み込みにチャレンジしてくれる。 GetUserDefaultUILa…

mozjpegをつかった画像変換ソフトの開発 その2

cjpegで設定可能なオプションは色々あるが、互いに排他的なものも結構ある。しかし、どれがそうなのかは明示されていない。そこでcjpeg.cを読んで整理してみた。Groupに番号が振ってあるものは、同じ番号内で相互に影響を及ぼすもの。 Option variables Grou…

mozjpegをつかった画像変換ソフトの開発 その1

mozjpegを使ったwindows用の画像変換ソフトで、以下を満たすものを探したが見つからなかった。 Windows用 GUI 複数の画像ファイルを一括変換 入力ファイルはJPEG, PNG, GIF, BMP マルチスレッドにより複数同時圧縮 無いなら作ればいいじゃん、ということで開…

mozjpegのwindows用ビルドにチャレンジ

mozjpegのwindows用ビルドにチャレンジしてみた。 mozjpegはmozillaが開発している、libjpegおよびlibjpeg-turbo互換のJPEG画像処理ライブラリ。圧縮率と画質の両立を目指して開発されている。 github.com ちょっと手元にある大量のpngファイルを纏めてjpeg…

VisualStudio2019でUnityのコードが補完されなかったりする件

UnityからVisual Studio 2019を呼び出したらUnity固有の機能が使えなかった問題と、その対処法メモ。 目次 目次 経緯 まとめ 経緯 Unityのお勉強をするため、VisualStudio2019でC#のコードを作ろうとしたらいきなり挫折した。Microsoftのマニュアルに書いて…

Visual studioのC++で実行ファイルのプロパティにビルド番号を埋め込む

Visual studio, 便利なのに、なぜかビルドしたファイルのバージョンプロパティにビルド番号を埋め込めない。そこで、下記にあるIncrementBuildを導入した。 Build Incrementing for Visual Studio C++ Projects – Fooling Around 動作原理 ビルド後のイベン…

Visual Studio2017でWindowsXp用プログラムをビルドする

事情によりWindowsXp用プログラムをビルドすることになったんだけど、WINVER等の定数をいじっても、出来上がったソフトが動かなかった。確か、有効な実行ファイルではありませんとか言われる。なんでかなーと思いながらオプションながめてたら、こんなの発見…

GetLastError()の結果をCStringで出力するクラス

GetLastError()で得たエラーコードを毎回FormatMessageで変換するのが面倒だったので、両者をひとまとめにしてCStringまたはLPCTSTRで返すクラスを作った。 注意! LPCTSTRは一時オブジェクトのアドレスを返すので、長時間使わないこと。すぐに無効なアドレ…

CString等でUnicodeとマルチバイトを相互に変換する

CString等でUnicodeとマルチバイトを相互に変換する方法のメモ。こんな便利なマクロ(実態はクラス)があったとは。例えば、UnicodeからANSI(マルチバイト)に変換する場合はCW2A(string)でOK。逆に、ANSIからUnicodeならCA2W(string)。マクロの返り値が変換…

CImageからcv::Matへの画像コピー

MFCで画像をお手軽に使えるクラスCImageから、画像処理の定番OpenCV用のクラスcv::Matへ画像をコピーするのは、一見簡単だが罠がある。CImageが保持している画像データへのポインタはCImage::GetBits()で取得できるのだが、このポインタ、データの先頭を指す…

Critical error detected c0000374

昔作ったソフトの改造をしていたら、突然「Critical error detected c0000374」というエラーが出て止まるようになった。実行継続して例外を処理させてみたら、 「ハンドルされない例外が 0x00007FFB1E01E6FC (ntdll.dll) で発生しました(伏せ字.exe 内): 0xC…

Visual Studioの出力ウィンドウにデバッグ文字列を出力する(ATLTRACE, AtlTrace, _RPTn)

Visual Studioを使ってWIndowsプログラムのデバッグ中に、プログラムや変数の状態を表示したい・残したいと思う人や、なんでstderrが使えないんじゃああ!という人向けメモ。 C/C++でこれをするには、OutputDebugStringや_RPTNという関数が便利。他にもATLTR…