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

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

Visual Studio

Redmineダウンローダ開発メモ(11) 正規ビューワーの開発-検索結果の生成

Redmineダウンローダ開発メモ(10) 正規ビューワーの開発-タブ追加の流れ - ドナドナされるプログラマのメモの続き。 タブビューワー機能はできたので、最後の大物として検索機能を入れる。検索機能の実装は以下4ステップに分ける。 全JSONの結合 検索 表示 …

Redmineダウンローダ開発メモ(9) 正規ビューワーの開発-CMFCTabCtrlの表示方法・サイズ変更方法

Redmineダウンローダ開発メモ(8) 簡易ビューワーの開発-ひとくぎり - ドナドナされるプログラマのメモの続き。 個別Issueしか開けなかった簡易ビューワーをもとに、複数のIssueを開いたりRedmineプロジェクト全体に対する検索ができる正規ビューワーを作る。…

Redmineダウンローダ開発メモ(8) 簡易ビューワーの開発-ひとくぎり

Redmineダウンローダ開発メモ(7) 簡易ビューワーの開発-途中経過 - ドナドナされるプログラマのメモの続き。 マークダウンのサポートなどが一通りできたのでいったんリリース。DownloaderもViewerに必要なデータをダウンロードするために1.4.0へ更新。 Redmi…

Redmineダウンローダ開発メモ(7) 簡易ビューワーの開発-途中経過

Redmineダウンローダ開発メモ(6) 簡易ビューワーの開発方針 - ドナドナされるプログラマのメモの続き。 とりあえず_issue.jsonを解釈しテンプレートhtmlに基づき表示するところまではできた。 github.com RedmineViewer1.0.0外観 でも、まだマークアップをサ…

WebView2にドラッグアンドドロップされたファイルをアプリ側で取得する

copilotやgeminiに何度も騙されながらWebView2にドラッグアンドドロップされたファイルをアプリ側で取得することに成功したのでメモ。 2026年3月現在、WebView2はドラッグ&ドロップされたファイルをアプリ側に知らせる直接のAPIを持っていない。そのため、間…

Redmineダウンローダ開発メモ(6) 簡易ビューワーの開発方針

Redmineダウンローダ開発メモ(5) ビューワーの開発方針 - ドナドナされるプログラマのメモの続き。 簡易ビューワーの開発方針というか要件を以下のように定める。 要件 JSONファイルをドラッグ&ドロップするとJSONファイルの中身を表示する。 表示の仕方はR…

Redmineダウンローダ開発メモ(5) ビューワーの開発方針

Redmineダウンローダ開発メモ(4) ひとまずリリース - ドナドナされるプログラマのメモの続き(続いちゃった)。 ダウンローダを作ったのはいいけど、保存データが生JSON改行抜きなので視認性がすこぶる悪い。なので、ダウンロードしたデータを活用するにはビ…

Redmineダウンローダ開発メモ(4) ひとまずリリース

Redmineダウンローダ開発メモ(3) ソフト開発-3 Redmineサーバーにアクセスする同期コードとか、JSONをCStdioFileからUTF-8で保存するコードとか - ドナドナされるプログラマのメモ の続き。 欲しい機能を一通り実装し終わったのでリリースした。 ソフトへの…

Redmineダウンローダ開発メモ(3) ソフト開発-3 Redmineサーバーにアクセスする同期コードとか、JSONをCStdioFileからUTF-8で保存するコードとか

Redmineダウンローダ開発メモ(3) ソフト開発-2 - ドナドナされるプログラマのメモ の続き。cppRESTを使ってRedmineサーバーからIssue一覧を取得するコードを書いた。cppRESTはメインの処理が別スレッドで実行される非同期ライブラリであり同時に複数のタスク…

ワーカースレッドを持つMFCアプリの開発 (復習)

あまりにも久しぶりなので、MFCアプリのワーカースレッド作成と、ワーカースレッドから親スレッドGUIへのアクセスについて復習。ポイントは以下。 ワーカースレッドの作成はAfxBeginThread()を使う( マルチスレッド: MFC でのワーカー スレッドの作成 | Micr…

Redmineダウンローダ開発メモ(3) ソフト開発-2

Redmineダウンローダ開発メモ(3) ソフト開発 - ドナドナされるプログラマのメモ の続き。 まずは簡単なテストコードを作り、RedmineサーバーからIssue一覧を取得できるようにした。 次に、ちゃちゃっとダイアログを作った。数百Issueを取得するため、中断ボ…

VCPkgおよびC++REST導入メモ

新しい環境でC++RESTを使うことになったので、C++RESTおよびそのために必要なVCPkgの導入方法をメモ。 GithubよりVCPkgのソースコードをダウンロード。 github.com 中身をsource/repos/vcpkgに展開する。 コマンドプロンプトまたはPowerShellを起動し上記フ…

_alloca, _malloca関数について

マイクロソフトのテクニカルノートを読んでいたら、以下のような記述を発見。 「各マクロの実装では、_alloca() 関数を使用して、ヒープではなくスタックからメモリを割り当てます。 スタックからメモリを割り当てると、メモリをヒープに割り当てるよりもは…

SourceTreeでVisualStudioのリソースファイル(.rc)をテキストとして認識・diff表示させる手順

SourceTreeでVisualStudioのリソースファイル(.rc)をテキストファイルとして認識・diff表示させるのに苦労したので、手順をメモ。 最初に試したのはgitattributesに*.rc diff=astextplainを追加すること。でもだめだった。そこで、以下を参照しながらやって…

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のコア数が多いので、できればマルチスレッド対応としたい。その場合、どういうプログラム構成とすればいいのだろう? データ処理の流れはシンプルだ。 二次記憶からデー…