TaskScheduler.Default

TaskScheduler.Defaultは、デフォルトのTaskSchedulerインスタンスを持つ。

TaskScheduler.Default プロパティ (System.Threading.Tasks) | Microsoft Docs

TaskScheduler.Currentと同じかどうか確かめる。

実行すると、

Default: System.Threading.Tasks.ThreadPoolTaskScheduler
Current: System.Threading.Tasks.ThreadPoolTaskScheduler
Main(1)
Task(1)
Main(2)
Task(2)
Main(3)
Task(3)
Main(4)
Task(4)
Main(5)
Task(5)
続行するには何かキーを押してください . . .

同じSystem.Threading.Tasks.ThreadPoolTaskSchedulerオブジェクトになっていることがわかる。

Sample/dotnet/TaskScheduler/Default/src/TaskScheduler_ at master · bg1bgst333/Sample · GitHub

null許容値型

値型はnullを持てないが、null許容値型にすると、有効な値かnullのどちらかを持てるので、値を持っているかnullかをチェック出来る。

null 許容値型 - C# リファレンス | Microsoft Docs
null許容値型(Nullable<T> 型) - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
Nullable Type

型の後ろに'?'を付けると、null許容値型になる。
null許容値型は、.HasValueで値を持っているかnullかどうかチェックできる。
trueの場合、.Valueで値を取得。

x1 has not Value.
x2 = 10
続行するには何かキーを押してください . . .

x1はnullなので、.HasValueはfalse。
x2は10なので、.HasValueはtrueで、.Valueは10。

Sample/cs/NullableType/NullableType/src/NullableType at master · bg1bgst333/Sample · GitHub

IStream

IStreamは、ストリームオブジェクトに対する読み書きや各種情報などを取得する機能を提供するインターフェース。

IStream (objidl.h) - Win32 apps | Microsoft Docs

ストリームサイズ(ファイルサイズ)を取得してみる。

コンソール
コンソール

コンソール。

空プロ
空プロ

空プロ。

shlwapi.libをリンク
shlwapi.libをリンク

shlwapi.libをリンク。

test.txtを用意
test.txtを用意

test.txtを用意。

pStream->Statでストリーム情報を取得。
statstg.cbSizeがストリームサイズ。

tszPath = c:\project\cloud\github.com\sample\com\istream\istream\src\istream\deb
ug\test.txt
statstg.cbSize = 5
続行するには何かキーを押してください . . .

"ABCDE"なので5バイト。

Sample/com/IStream/IStream/src/IStream at master · bg1bgst333/Sample · GitHub

DECLARE_WND_CLASS

DECLARE_WND_CLASSで、ウィンドウクラス名を指定する。

ウィンドウクラスマクロ | Microsoft Docs

実は、NULLを指定しても、ウィンドウが作成される。

今度はWin32
今度はWin32

今度はWin32。

Windowアプリケーションの空プロ
Windowアプリケーションの空プロ

Windowアプリケーションの空プロ。

DECLARE_WND_CLASSにNULLをセット。

ウィンドウ名も"DECLARE_WND_CLASS"に変更。

ウィンドウが表示された
ウィンドウが表示された

ウィンドウが表示された。
ウィンドウクラス名がどうなっているか調べてみる。

ブレークポイントをここに置いて
ブレークポイントをここに置いて

ブレークポイントをここに置いて、

ここに来たらどんどんステップインしていく
ここに来たらどんどんステップインしていく

ここに来たらどんどんステップインしていく。

どうも自動生成されてる模様。
どうも自動生成されてる模様。

どうも自動生成されてる模様。

WTL/ATLのメッセージマップ実現のしくみ

アドレスから自動生成されてるらしい。

Sample/atl/DECLARE_WND_CLASS/DECLARE_WND_CLASS/src/DECLARE_WND_CLASS at master · bg1bgst333/Sample · GitHub

CDocTemplate

CDocTemplateは、ドキュメントテンプレートの基本抽象クラス。

CDocTemplate クラス | Microsoft Docs

今回は、前回素通りしたpTemplate->LoadTemplateを見ていこう。

CDocTemplate クラス | Microsoft Docs

CDocTemplate:: LoadTemplateというメンバ関数

ここをステップイン
ここをステップイン

ここをステップイン。

中はこうなっている
中はこうなっている

中はこうなっている。

クラス名とかがちゃんとあるかチェック
クラス名とかがちゃんとあるかチェック

クラス名とかリソースIDがちゃんとあるかチェック。

埋め込みリソースやメニューかな
埋め込みリソースやメニューかな

中には入らなかった。
次は、埋め込みリソースやメニューかな。

インプレースサーバとサーバリソースってCOMまわりかな
インプレースサーバとサーバリソースってCOMまわりかな

次も通った。
次は、インプレースサーバとサーバリソースってCOMまわりかな。

コンテナーリソースとメニューインプレース
コンテナーリソースとメニューインプレース
これも通った。
最後は、コンテナーリソースとメニューインプレース。

結局全部通った
結局全部通った

結局全部通った。
結局、ここでのLoadTemplateで特に処理はしていない模様。
まあ、指定したドキュメントテンプレートがちゃんと読み込まれてるってことかな。

Sample/mfc/CDocTemplate/CDocTemplate/src/CDocTemplate at master · bg1bgst333/Sample · GitHub

FillPath

FillPathで、パスの中を塗りつぶす。

FillPath function (wingdi.h) - Win32 apps | Microsoft Docs
パス

WM_PAINTで、

		// 画面の描画を要求された時.
		case WM_PAINT:		// 画面の描画を要求された時.(uMsgがWM_PAINTの時.)
 
			// WM_PAINTブロック
			{

				// このブロックのローカル変数の宣言
				HDC hDC;			// デバイスコンテキストハンドルを格納するHDC型変数hDC.
				PAINTSTRUCT ps;		// ペイント情報を管理するPAINTSTRUCT構造体型の変数ps.
				BOOL bRet;	// BOOL型変数bRet.

				// ウィンドウの描画開始
				hDC = BeginPaint(hwnd, &ps);	// BeginPaintでこのウィンドウの描画の準備をする. 戻り値にはデバイスコンテキストハンドルが返るので, hDCに格納.

				// 普通にテキスト描画.
				TextOut(hDC, 50, 50, _T("ABCDE"), _tcslen(_T("ABCDE")));	// TextOutで"ABCDE"を描画.

				// パスの開始.
				bRet = BeginPath(hDC);	// BeginPathでパスの開始.
				if (bRet){	// 真なら成功.
					
					// パスにテキスト描画.
					HFONT hFont, hOldFont;	// フォントハンドルhFont, hOldFont.
					SetBkMode(hDC, TRANSPARENT);	// SetBkModeで背景を透過.
					hFont = CreateFont(48, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 0, NULL);	// サイズ48のフォントを生成.
					hOldFont = (HFONT)SelectObject(hDC, hFont);	// SelectObjectでhDCとhFontの組み合わせを選択.
					TextOut(hDC, 50, 100, _T("FGHIJ"), _tcslen(_T("FGHIJ")));	// TextOutで"FGHIJ"を描画.
					SelectObject(hDC, hOldFont);	// SelectObjectで元に戻す.
					DeleteObject(hFont);	// DeleteObjectでhFontを削除.
					
				}

				// パスの終了.
				EndPath(hDC);	// EndPathでパスの終了.

				// パスの描画.
				StrokePath(hDC);	// StrokePathでパスの輪郭を描画.

				// パスの内部を塗りつぶし.
				HBRUSH hBrush, hOldBrush;	// ブラシハンドルhBrush, hOldBrush.
				hBrush = CreateSolidBrush(RGB(0xff, 0x0, 0x0));	// CreateSolidBrushで赤いブラシを作成.
				hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);	// SelectObjectでhDCとhBrushの組み合わせを選択.
				FillPath(hDC);	// FillPathでパスの内部を塗りつぶす.
				SelectObject(hDC, hOldBrush);	// SelectObjectでhOldBrushに戻す.
				DeleteObject(hBrush);	// DeleteObjectでhBrushを削除.

				// ウィンドウの描画終了
				EndPaint(hwnd, &ps);	// EndPaintでこのウィンドウの描画処理を終了する.

			}

			// 既定の処理へ向かう.
			break;	// breakで抜けて, 既定の処理(DefWindowProc)へ向かう.

TRANSPARENTにして背景を透過、フォントも48と大きくした。
FillPathの部分は、EndPathや、StrokePathの後ろに書いている。
赤いブラシを作って、選択して、その色で塗りつぶすのだが、

輪郭描画はあるのに塗りつぶされない。
輪郭描画はあるのに塗りつぶされない。

輪郭描画はあるのに、塗りつぶされない。
どうも、同時には出来ない模様。

StrokePathをコメントアウトすると、

輪郭描画はされなくなったが、赤いブラシでの塗りつぶしはされるようになった。
輪郭描画はされなくなったが、赤いブラシでの塗りつぶしはされるようになった。

輪郭描画はされなくなったが、赤いブラシでの塗りつぶしはされるようになった。

Sample/winapi/FillPath/FillPath/src/FillPath at master · bg1bgst333/Sample · GitHub

execv

execvも、execlと同様に、指定の実行ファイルを実行して、そのプロセスに置き換わる。
違いは、第2引数以降を配列で渡せるぐらい。

Man page of EXEC

execv_main.cを、

として、
execv_sub.cを、

とする。

$ vi execv_main.c
$ vi execv_sub.c
$ gcc execv_main.c -o execv_main
$ gcc execv_sub.c -o execv_sub
$ ./execv_main
argv[0] = ./execv_sub
argv[1] = 123
argv[2] = abc
argv[3] = xyz
$

./execv_mainで実行すると、./execv_subに配列で指定した引数が渡される。

Sample/unixsyscall/execv/execv/src/execv at master · bg1bgst333/Sample · GitHub