- ★自作プログラム、評価してよスレッド」★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++用テンプレートライブラリです。
ベクトルや行列の計算が簡単にできちゃう!?
|