Windowsでプロセスで共有する変数を定義する

sharedセクションをつかう

以下のコードで変数iをプロセスで共有できる。すべてのプロセスがなくなると消える。

プロジェクトは以下を参照
https://github.com/ambiesoft/blogprogs/tree/master/5637

System.Windows.Forms.TextBoxのvalidatingとvalidated

WinformのTextコントロールにはvalidatingvalidatedイベントがある。

validatingイベント

Textコントロールがフォーカスを失ったり、親のフォームが閉じられようとすると呼ばれる。引数はCancelEventArgsであり、Canceltrueを設定することで、キャンセルすることができる。

キャンセルされると、フォーカスが移動できなかったりする。

validatedイベント

validatingが成功すると(Cancelされなかった)呼ばれる。validatingは上記のような状況で呼ばれるので、そのときに呼ばれる。Text変更時にはvalidatingvalidatedも呼ばれない。

サンプル

https://github.com/ambiesoft/blogprogs/tree/master/5623/txtvalidateandchange

ST31000524ASのファームウェアのアップデート

注意:これをやると壊れます。

Dellのinspiron-620sというマシンをWindows10で使っていたのだが、それに積んでいるHDDがLED点灯状態になる問題が発生した(普通は点滅する)。この現象に伴ってファイルが読めなくなる(読み込むと固まる)などの問題が発生したため、HDDのファームウェアのアップデートをしてみることにした。

HDDはST31000524ASという型番、検索するとDellでファームウェアのアップデートが提供されていたので実行してみることにした。


圧縮ファイルに含まれる、B7000100.exeというファイルを実行すると、おそらくファームウェアを適用したあとに再起動したのだが、HDDからブートできなくなってしまった。幸いこのマシンにはSSDも積んでいてそこからもブートできるようになっていたので、起動することはでき、HDDの中身も無事みたいだが、HDDが1つしかない場合は、Windowsを再インストールすることになると思う。

SSDからHDDで起動したあとにEasyBCDを使って再びHDDにBCDを書き込んで、HDDからブートできるように戻すことができた。

このソフトはブート時に使ったBCDの情報を表示するようだ。ここでE:\になっているのはシステムで予約済みの領域で、bootやEFIなどのフォルダとbootmgr,BOOTNXTなどのファイルがある。ここにBCDを書き込むことでもとに戻すことができた。

LED点灯問題は今のところ起きていないが、しばらく様子を見ないとわかない。

更新前のファームのバージョンは確認しなかったが、更新後の情報はHWiNFO64でみると以下のようになっていた。

追記

上記のファームウェアアップデートをしても同じ問題が再現したのでファームウェアの問題ではないようだった。その後色々しらべるとSEAGATEからディスク診断修復ツールであるSeaToolsというものがあるとわかったのでこれを試してみることにした。

ベーシックテストでもエラーはでなかったのでHDDにエラーはないものと思われる。

その後いろいろ調べてみると、同じような問題でDVDドライブがおかしくなるとLED点灯が起こるとあったので調べてみると問題が発生しているときはDVDドライブが見えなくなっていることがわかった。起動時から見えないときもあるし、起動してしばらくしてから見えなくなることもある。これが原因かもしれないので更に調査してみようと思う。

コマンドの時間を計測する

Linux

timeコマンドを使う

Windows

powershellのMesure-Commandを使う

stringのvectorをスペースで区切って1つのstringにする


TLTR

ostringstreamとは

<<で渡された値を内部に持っているstringに追加していく。

ostream_iteratorとは

=で渡された値をコンストラクタで渡された出力ストリームに追加していく。
コンストラクタの2番めの引数はデリミタを指定する。=でストリームに追加したあとにこの値も追加する。デフォルトでは何も追加しない。
++演算では何もしない。これにより下記のcopyで役に立つ。

上のコードは以下のようにコンソールに出力される。

copyとは

第一引数と第二引数のイテレータで入力範囲を指定する。
第三引数で出力イテレータを指定する。

入力出力とも++で一個ずつずらしていって=でコピーする。

ostream_iteratorの++は何もしないで=で値をストリームに追加する。(最初のコード参照)

Win32APIが呼ばれたときブレークポイントを設定する

CreateProcessでブレークポイント

CreateProcessでブレークポイントを設定するには、新規ブレークポイントで以下のように入力する。

kernel32.dllはこの関数を実装しているDLL40、はこの関数の引数のバイト数だと思われる。

CreateProcessにブレークポイント

このやり方でうまくいかない場合

プログラムの最初の方で適当なブレークポイントを設定し、以下のコードの結果を調べる。

このアドレス値でブレークポイントを設定する。
アドレスでブレークポイント

アドレスでブレークポイント設定"

ShellExecuteExなどはCreateProcessを他のスレッドで呼ぶらしい。その場合はデバッグの場所でメインスレッドを指定する。
メインスレッドを選択

スタックトレースがうまく表示されないときはシンボルのロードをする。

追記:Visual Studio 2017以降で動かない場合

関数ブレークポイントの設定で以下のように入力する(アンダーバーと@以下を削除する)。

PowerShellでbashのようなオートコンプリート

有効にする

恒久的に有効にする

上記の内容を書いたファイルをC:\Users\\Documents\WindowsPowerShell\profile.ps1におく。

セキュリティ

セキュリティ警告が出たときは以下を実行(管理者権限のpowershell)

VS2019のC++でstdのソースコードでバッグをする

/JMCを削除

デバッグモードでのデフォルトのコンパイルフラグに/JMCが追加されていて、これが有効になっているとstdのソースコードにステップ・インできない。よってこれを無効にする(以下の画像を参照)
/JMCを無効にする
デバッグオプションのJust My Codeはモジュールごとに区分けしていると思うので、どうでもいいはず。

Win32APIのコールバック

コールバック関数(これは自分で定義したもの)のデバッグを効率良く行うには/JMCを有効にしたほうが良い。このフラグを有効にすると、コールバックを引数にするAPIを呼んだときに、そのコールバックにステップ・インしてくれる。