トップページ > プログラム > 2016年08月15日 > ZZZ997rF

書き込み順位&時間帯一覧

2 位/169 ID中時間01234567891011121314151617181920212223Total
書き込み数00000000022122110001001013



使用した名前一覧書き込んだスレッド一覧
片山博文MZ ◆T6xkBnTXz7B0
デフォルトの名無しさん
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
スレを勃てるまでもないC/C++の質問はここで 24 [転載禁止]©2ch.net
【知識】俺のためのプログラム覚え書き【共有】

書き込みレス一覧

★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
348 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 09:06:15.74 ID:ZZZ997rF
では続きをやろう。win32ss\user\ntuser\window.cの156行目にIntIsWindow関数がある。
これは指定されたハンドルからPWNDが取得できたらTRUEを返すシンプルな関数だ。
PWNDの定義はwin32ss\include\ntuser.hの656行目にある。
window.cの184行目にIntGetParent関数がある。これは親ウィンドウを返す関数だ。
win32ss\user\user32\windows\window.cには、IsWindow APIとGetParent APIの実体がある。APIと内部関数は多少動作が違うが、似た動作になっている。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
349 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 09:36:07.33 ID:ZZZ997rF
次に、ウィンドウがどのように作成されるかを見てみよう。
フォルダwin32ssをCreateWindowExでgrepする。win32ss\user\user32\windows\window.cの
452行目にCreateWindowExWの定義が見付かる。中身を読んでみると、(1)システムコントロールが登録されていなかったら登録する。(2) 拡張スタイルにWS_EX_MDICHILDがあれば、あれこれ処理を行う。
(3)その後はUser32CreateWindowExに丸投げ、という形になっている。User32CreateWindowExは、152行目にある。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
350 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 10:05:28.44 ID:ZZZ997rF
さらにUser32CreateWindowExの中身を見てみると、文字列処理、メニューのロード、後はNtUserCreateWindowExに丸投げ、という形である。
カーネルの文字列処理ではCRT関数は使えないので、LARGE_STRING、UNICODE_STRING構造体、Rtl関数などを使って処理している。
lstrはLARGE_STRINGのprefixで、ustrはUNICODE_STRINGのprefixだ。
NtUserCreateWindowExは、win32ss\user\ntuser\window.cの2386行目。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
351 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 10:11:54.93 ID:ZZZ997rF
さらにさらに、NtUserCreateWindowExを見てみると、
------
あれこれ初期化
UserEnterExclusive();
pwnd = co_UserCreateWindowEx(...);
...
hwnd = pwnd ? UserHWGetHandle(pwnd) : NULL;
UserLeave();
後片付け
return hwnd;
------
という形になっている。UserHWGetHandleはPWNDからHWNDを取得する関数だ。ここで、
UserEnterExclusive();

UserLeave();
の間のコードは特別な意味がある。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
352 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 11:44:56.59 ID:ZZZ997rF
UserEnterExclusive();とUserLeave(); の間は「排他制御」(はいたせいぎょ)の区間である。
ReactOSはマルチスレッドOSなので、1つのデータや資源に複数のスレッドからアクセスされることがある。
そのとき、同時にアクセスされたために読み書きされた内容がおかしくなる可能性がある。それを防ぐために、データや資源へのアクセスにロックを掛けて、ロックされているときはロックが解除されるまで待つという機構が排他制御である。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
354 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 12:29:50.36 ID:ZZZ997rF
カーネル内部で使用できるRtl関数の定義は、sdk\lib\rtlにある。
メモリー初期化用のRtlZeroMemoryや、Unicode文字列の初期化のRtlInitUnicodeStringなどが見付かるだろう。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
356 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 12:46:55.74 ID:ZZZ997rF
で、co_UserCreateWindowExだが、ザッと400行ほどあって、常人はかみ砕いていかないと理解できないだろう。
という訳でこの辺でウィンドウ作成コードの研究をいったんやめる。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
359 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 13:52:56.53 ID:ZZZ997rF
今度はメニューの作成コードを見るぞ。
win32ss\user\user32\windows\menu.cの840行目にCreateMenu APIがあり、これはNtUserxCreateMenuに丸投げしている。
win32ss\user\user32\include\ntwrapper.hの551行目にインライン関数NtUserxCreateMenuがあり、これはNtUserCallNoParam(NOPARAM_ROUTINE_CREATEMENU)を呼ぶだけだ。
NtUserCallNoParamの定義は、win32ss\user\ntuser\simplecall.cの58行目にあり、UserEnterExclusive();とUserLeave();の間でUserCreateMenuを呼んでいる。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
360 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 13:57:04.85 ID:ZZZ997rF
UserCreateMenuはIntCreateMenuを呼ぶ。win32ss\user\ntuser\menu.cの741行目にIntCreateMenuの定義がある。
IntCreateMenuはUserCreateObjectを呼んでユーザーオブジェクトPMENUを作成し、初期化を行う。PMENUの定義はwin32ss\include\ntuser.hの382行目にある。
★自作プログラム、評価してよスレッド」★1 [無断転載禁止]©2ch.net
361 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 14:00:35.87 ID:ZZZ997rF
ここで重要なのは、ユーザーオブジェクトの作成には、排他制御が必要であることだ。
ユーザーオブジェクトを作成するコードは、必ずUserEnterExclusive();とUserLeave();の間に置かなければならない。
スレを勃てるまでもないC/C++の質問はここで 24 [転載禁止]©2ch.net
996 :デフォルトの名無しさん[sage]:2016/08/15(月) 15:16:30.69 ID:ZZZ997rF
隔離病棟って何だよ
スレを勃てるまでもないC/C++の質問はここで 24 [転載禁止]©2ch.net
1000 :デフォルトの名無しさん[sage]:2016/08/15(月) 19:20:16.07 ID:ZZZ997rF
梅酒
【知識】俺のためのプログラム覚え書き【共有】
124 :片山博文MZ ◆T6xkBnTXz7B0 [sage]:2016/08/15(月) 22:46:50.42 ID:ZZZ997rF
Eigenは線形代数のC++用テンプレートライブラリです。
ベクトルや行列の計算が簡単にできちゃう!?


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。