Quantcast
Channel: visual studio - ドナドナされるプログラマのメモ
Browsing latest articles
Browse All 29 View Live

Image may be NSFW.
Clik here to view.

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

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

View Article



Critical error detected c0000374

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

View Article

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

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

View Article

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

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

View Article

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

GetLastError()で得たエラーコードを毎回FormatMessageで変換するのが面倒だったので、両者をひとまとめにしてCStringまたはLPCTSTRで返すクラスを作った。注意!LPCTSTRは一時オブジェクトのアドレスを返すので、長時間使わないこと。すぐに無効なアドレスとなるので、LPCTSTRで返り値を受け取る場合は速やかに別バッファにコピーすること。コピーしなくていいのは、Mes...

View Article


Image may be NSFW.
Clik here to view.

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

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

View Article

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

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

View Article

Image may be NSFW.
Clik here to view.

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

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

View Article


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

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

View Article


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

mozjpegを使ったwindows用の画像変換ソフトで、以下を満たすものを探したが見つからなかった。Windows用GUI複数の画像ファイルを一括変換入力ファイルはJPEG, PNG, GIF,...

View Article

MFCを使う場合の多言語化

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

View Article

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

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

View Article

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

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

View Article


Image may be NSFW.
Clik here to view.

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

どのようにマルチスレッド化するかを考え中。考えられる方針は大きく2つ。ファイルを1個開くたびに1スレッド作り、1変換をするたびに1スレッドを作り、1個書き出すたびに1スレッド作る。ブルジョワ方針。物理メディアごとに1スレッド作り、当該メディアで読み書きするファイルはすべてそのスレッドで処理。CPUコアごとに1スレッド作り、当該コアで処理するデータは(略)。けちんぼ方針。2.のほうがかっこいい実装だし...

View Article

Image may be NSFW.
Clik here to view.

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

Visual Studioのリソースエディタで、ダイアログのクラスを追加しようとして「クラスの追加」を選び必要事項を入力したら、「クラスが登録されていません」というエラーがでてしまった。クラスが登録されていません直接の原因はわからないが、適切なプロジェクトをスタートアッププロジェクトに設定したら治った。ちなみに、英語環境だと以下のエラーになる。Error HRESULT E_FAIL has...

View Article


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

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

View Article

CMultiLockの問題

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

View Article


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

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

View Article

Image may be NSFW.
Clik here to view.

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

とあるリソースをVisual Studio2019で開こうとしたら、error RC2104: undefined keyword or key name: WS_EX_COMPOSITED というエラーが出た。error RC2104: undefined keyword or key name:...

View Article

CArchive::ReadString, CArchive::WriteStringの罠

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

View Article

CDocumentからCViewを取得する一例

今時ドキュメントビューアーキテクチャなんて人は居ないだろうけど、メモ。CDocumentからCViewにメッセージを投げたいときや関数を直接呼び出したいときに困るのが、CViewのアドレス取得方法。特に、自分はCSplitterWndを多用したためCViewが複数あり決め打ち取得ができなずに困ってしまった。そこで以下のような簡単なコードを書いてみた。Example of finding CView...

View Article


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

ダイアログバー上のエディットボックスから文字列を取得するのにちょっと苦労したのでメモ。問題の背景ダイアログを作る場合、通常はCDialog等を継承した、そのダイアログ固有のクラスを作成する。しかしMicrosoft曰く、CDialogBarは通常固有のクラスを作成しないらしい。これは、ダイアログバーはメインウィンドウの一部で、各コントロールからのメッセージはメインウィンドウのウィンドウプロシージャで...

View Article


Image may be NSFW.
Clik here to view.

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

解決したい課題MFCを使ったソフトにおいて重い処理をしている最中に、進捗等を表示するダイアログを表示したくなることは多々ある。しかし、単純にダイアログを作って表示しようとしても、以下のようにうまく行かないことが多い。重い処理が終わるまでダイアログが表示されないダイアログは表示されるが、表示内容が更新されない何が原因かこれらが起きるのは、今の処理が終わらないとダイアログを表示するための処理が実行されな...

View Article

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

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

View Article

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

RedmineのデータをREST API経由でダウンロードするプログラムを作るためにcpprestを導入しようとした際に苦労した点のメモ。前記ソフトをMFCランタイムをダウンロードできない/しづらい環境でも使えるようにするため、MFCをスタティックライブラリとして組み込む必要があった。しかし、なぜか忌々しい「Debug assertion failed!」とともに、File:...

View Article


CSimpleLock::IsLockedの罠

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

View Article

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

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

View Article

Image may be NSFW.
Clik here to view.

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

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

View Article

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

MozJPEGがいつのまにか3.3.1から4.1.1に進化しており、GitHubにて対応要望が出ていた。そこで、開発を再開し4.1.1を適用しようとおもう。できたらいいな。MozJPEGがいつのまにか3.3.1から4.1.1に進化しており、GitHubにて対応要望が出ていた。そこで、開発を再開し4.1.1を適用しようとおもう。できたらいいな。環境立ち上げMozJPEGの変更点確認環境立ち上げ先日Ry...

View Article


Browsing latest articles
Browse All 29 View Live




Latest Images