これまでファイル構成やプロジェクト構成を見て概要を整理したので、今日こそ本題のコードリーディングをしていこうと思います。
OBS StudioのVer30、windows用の処理を参照していきます。
メイン関数からOBSのWindow表示までの概要
UIフォルダ下にあるobs-app.cppにmain関数があります。
main関数で色々処理した後にrun_program関数に渡してwindowを表示させています。
OBSのGUIの実装はQtを使っています。
(windowの基本的な中身はwindow-basic-main.cppで実装)
main関数の処理
main関数とrun_program関数の関係概要は下図のような感じになっています。
先ずは水色の部分のみ解説します。
起動処理
- install_dll_blocklist_hook:クラッシュ対策でdllの停止をしています(ver29~実装)
- “win-dll-blocklist.c”ファイルのblocked_modules配列に停止dllリストが実装されています
- アプリ起動時のクラッシュ処理
- obs_init_win32_crash_handler
- obs-windows.c -> obs-win-crash-handler.cでエラーハンドラ実装
- SetErrorMode
- SEM_FAILCRITICALERRORSをセットすることでエラーメッセージを非表示でアプリ終了させる。(WINAPI関数)
- load_debug_privilege
- OBSに対して「デバッグ特権」,ベース優先度の増加特権の有効化などを設定
- base_set_crash_handler
- クラッシュ時の保存内容等を設定する処理
- obs_init_win32_crash_handler
- RTWorkQ.dllのロード
- Real-Time Work Queue:マルチメディアやリアルタイムデータ処理に関連する機能
- ”win-wasapi.cpp”で使用する為
- base_get_log_handler:ログ処理用
- obs_set_cmdline_args:OBS起動時の引数処理
- 例:コマンドラインで下記を実行するとメッセージボックス付きでhelp一覧表示をしてくれる。(珍しい気がする…)
obs64.exe -h
- #if ALLOW_PORTABLE_MODE~:ポータブルモード時の処理
- 主にフォルダ関連設定
- ポータブルモードとはUSBメモリ等に入れて使いたい場合のモード
- check_safe_mode_sentinel:セーフモード時処理
- upgrade_settings
- curl_global_init:libcurlを初期化。
- URL転送ライブラリ
- run_programへ
終了処理
OBSのwindowが閉じられたら(終了したら)ここへ戻る。
- RTWorkQ.dllの終了
- log_blocked_dlls:install_dll_blocklist_hookでブロックしたdllの情報をログ書き込み
- delete_safe_mode_sentinel
- メモリリーク情報のログファイルへの書き込み
- base_set_log_handler
- リスタート処理