OmsiLaunchW.exe リファレンス

ドキュメントのバージョン v0.1.0-beta.3GitHub でソースを見る

このページは OmsiLaunch 0.1.0-beta3 の英語版の原文ページの翻訳です。規範となるのは英語版です。内容が異なる場合は、英語版のページとコードが優先されます。

OmsiLaunchW.exe は、OmsiLaunch コントローラーの Windows サブシステム(GUI)ホストです。OmsiLaunch.exe と同じコマンドラインを受け付け、同じコントローラーコード(OmsiLaunch.Controller.dll)を実行します。唯一の違いは報告の方法です。コンソールウィンドウはなく、失敗はメッセージボックスとして表示され、実行中のセッションはそのトレイアイコンを通してのみ確認できます。

根拠となるソース: tools\OmsiLaunch.Bootstrapper\OmsiLaunch.WindowsHost.cpp(ネイティブシム)、tools\OmsiLaunch.Cli\WindowsHost.cs(WindowsHost、SessionTrayIndicator)、tools\OmsiLaunch.Cli\Program.cs(CliProgram.RunAsync、OwnerSession.RunAsync、CliInput.Write*)。

OmsiLaunch.exe と OmsiLaunchW.exe の比較#

項目OmsiLaunch.exeOmsiLaunchW.exe
サブシステムコンソール。エクスプローラーから起動するとコンソールウィンドウが開きます。Windows(GUI)。コンソールウィンドウはありません。
ネイティブシムOmsiLaunch.Bootstrapper.cppOmsiLaunch.WindowsHost.cpp
環境変更なし.NET が起動する前に、コントローラープロセスに OMSILAUNCH_WINDOWS_HOST=1 を設定します
引数CommandLineToArgvW でトークン化され、変更されずにコントローラーに渡されます同じです。そのため、両方のホストはまったく同じフラグとコマンドを受け付けます(CLI リファレンス)
テキスト出力stdout に書き込まれます抑止されます。ただし --json が指定された場合は例外です(その場合は JSON エンベロープが stdout に書き込まれ、呼び出し元はそれをリダイレクトできます)
エラーOL_E_...: message または JSON エラーエンベロープ同じコンソール出力規則に加えて、すべてのエラーでメッセージボックスが表示されます(エラーダイアログを参照)
/silent残りの引数で OmsiLaunchW.exe を起動し、0 を返します無視されます。コマンドはすでに Windows ホスト内で実行されています
トレイアイコンオーナーセッションで表示されますオーナーセッションで表示されます
停止経路トレイ、session stop、OMSI の終了、/observe-seconds、Ctrl+C、コンソールを閉じるトレイ、session stop、OMSI の終了、/observe-seconds(コンソールがないため、Ctrl+C とコンソールを閉じる操作は該当しません)
終了コードPublicExitCode 0..10、シムコード 100..106同じコード

起動の仕組み#

  1. シムは自身のパスを解決し(GetModuleFileNameW)、同じディレクトリに OmsiLaunch.Controller.dll があることを想定します。
  2. コマンドラインをトークン化し(CommandLineToArgvW)、OMSILAUNCH_WINDOWS_HOST=1 を設定します。
  3. パッケージに含まれる nethost.dll を通じて hostfxr を探して読み込み、引数を渡してコントローラーを初期化し(コントローラーのパスは、CLI パーサーが受け取る引数リストには含まれません)、実行します。
  4. シムはコントローラーの終了コードを変更せずに返します。

コントローラーが実行される前のいずれかの手順が失敗した場合、シムはタイトルが OmsiLaunch、テキストが OmsiLaunch could not start the .NET host (code N). のメッセージボックスを表示し、そのコードで終了します。

コード失敗した手順
100実行ファイルのパスを解決できませんでした
101コマンドラインをトークン化できませんでした
102hostfxr の場所の探索に失敗しました(通常は .NET 6 x64 ランタイムがインストールされていません)
103hostfxr のパスを取得できませんでした
104hostfxr を読み込めませんでした
105必要な hostfxr エクスポートがありません
106マネージドホストを初期化できませんでした(例: OmsiLaunch.Controller.dll またはそのランタイム構成がない、または Windows Desktop ランタイムが存在しない)

OmsiLaunch.exe も同じ表を使用しますが、何も出力しません。これらのダイアログはランタイムで発生させて確認されていません(ランタイム検証ステータスを参照)。

起動方法#

ショートカット、スクリプト、または別のプログラムから直接起動する場合:

OmsiLaunchW.exe /new /map:maps\Grundorf\global.cfg /entrypoint-index:1
OmsiLaunchW.exe /predefined-profile:<PROFILE_NAME> /predefined-profile-index:1 /new

OmsiLaunch.exe から /silent を使って起動する場合:

OmsiLaunch.exe /silent /new /map:maps\Grundorf\global.cfg /entrypoint-index:1

実行ファイルは OMSI 2 のインストール環境に配置してください(パッケージのレイアウトについてはパッケージングを参照)。インストール環境の引数がない場合、インストール環境は実行ファイルを含むディレクトリになります。インストール環境を明示する場合は、OmsiLaunch.exe と同様に最初の引数として渡します(OmsiLaunchW.exe "<OMSI_PATH>" /new ...)。

GUI プログラムであるため、cmd.exe とエクスプローラーはその終了を待ちません。スクリプトから終了を待って終了コードを読み取るには、cmd.exe では start /wait OmsiLaunchW.exe ... を、PowerShell では Start-Process -Wait -PassThru を使用してください。

$p = Start-Process -FilePath .\OmsiLaunchW.exe -ArgumentList '/new','/map:maps\Grundorf\global.cfg','/entrypoint-index:1' -Wait -PassThru
$p.ExitCode

/silent による委譲#

OmsiLaunch.exe ... /silent(または --silent)は、まだ OmsiLaunchW.exe の下で実行されていない場合、次の処理を行います(CliProgram.RunAsync、CliProgram.SilentDelegation)。

  1. OmsiLaunch.exe のディレクトリで OmsiLaunchW.exe を探します。見つからない場合: OL_E_WINDOWS_HOST_MISSING、終了コード 7。
  2. 現在のディレクトリと、/silent/--silent を除くすべての引数を元の順序のまま使用して、ShellExecute(UseShellExecute = true)経由で OmsiLaunchW.exe を起動します。ShellExecute は呼び出し元のハンドルを新しいプロセスに継承させないため、OmsiLaunch.exe /silent の出力をキャプチャする呼び出し元がセッションの存続期間中ブロックされることはありません(ランタイムクロージャ BUG-03)。プロセスが返されない場合: OL_E_WINDOWS_HOST_START_FAILED、終了コード 7。
  3. silent エンベロープを書き込み、ただちに 0 で終了します。
{"ok": true, "command": "silent", "protocol_version": "0.1", "result": {"delegated": true, "host_process_id": 12345}}

終了コード 0 は、OmsiLaunchW.exe が起動されたことだけを意味します。セッションの結果(プラン作成時のエラー、すでにアクティブなオーナー、開始の失敗)は、OmsiLaunchW.exe が独自のダイアログと診断情報で報告します。その後、2 つのプロセスは互いに独立しています。OmsiLaunch.exe は終了しており、OmsiLaunchW.exe がセッションオーナーです。セッションを確認するには OmsiLaunch.exe session status を使用してください。

/silent は他のすべてのコマンドより先に適用されるため、OmsiLaunch.exe /silent session status も session status を OmsiLaunchW.exe 内で実行し、その出力は抑止されます。/silent は起動にのみ使用してください。

OmsiLaunchW.exe における各コマンドの動作#

コマンドライン結果
引数なしdetect を表示なしで実行し、0 で終了します(何も表示されません)
実行可能なプランを持ち、オーナーが存在しない起動(/new、/saved:...、/spec:...、セッションプロファイル)セッションオーナーになります。開始中と実行中はトレイアイコンが表示されます。セッションが終了すると終了します(完了時は 0、失敗時は 1)
プランが実行不可である起動プランの最後の OL_E_ 診断を示すダイアログ(フォールバックは The session plan is not runnable. / OL_E_SESSION_START_FAILED)、終了コード 1(ドキュメント監査 BUG-06。修正前は何も表示せずに終了していました)
インストール環境にすでにオーナーがアクティブな状態での起動OL_E_SESSION_ALREADY_ACTIVE のダイアログ、終了コード 7。実行中のセッションには影響しません
Running に到達しない起動最後の OL_E_ 診断を伴うダイアログ The OMSI session did not reach gameplay.、終了コード 1。ダイアログが開いている間に、セッションスーパーバイザーが OMSI を終了させてファイルを復元します。プロセスは、ダイアログが閉じられ、CloseAsync が完了した後に終了します
無効な引数、不明なフラグ、または無効なセッションプロファイルOL_E_INVALID_ARGUMENT または OL_E_SESSION_PROFILE_* コードのダイアログ、終了コード 2
オーナーが存在しない状態でのクライアントコマンド(session status、session stop、events read、time get、/runtime:...)OL_E_NO_ACTIVE_SESSION のダイアログ、終了コード 4
オーナーが拒否したクライアントコマンド拒否コード(例: OL_E_CONTROL_SESSION_MISMATCH またはランタイムのエラーコード)のダイアログ、終了コード 7(不明な操作または引数の欠落の場合は 2)
成功したクライアントコマンドまたは検出系コマンド(session status、/list:...、help、capabilities、/version、/recovery-status)--json が指定され、かつ stdout がリダイレクトされている場合を除き、目に見える出力はありません。終了コードは OmsiLaunch.exe と同じです
/plan または /validate実行不可のプランであってもダイアログは表示されません。終了コード 0 または 1
その他のコントローラーの失敗分類された OL_E_ コードのダイアログ。終了コードは終了コードに従います

エラーダイアログ#

OmsiLaunch.exe が出力するはずのすべてのエラーは、--json が指定された場合でも、モーダルなメッセージボックス(WindowsHost.ShowFailure)としても表示されます。

Title:  OmsiLaunch            (error icon)

<message>

Code: OL_E_<CODE>

See .omsilaunch\diagnostics for details.

<message> はエラーメッセージ、またはセッションの失敗の場合は最後の OL_E_ 診断のメッセージです。既知の制限事項: プラグインが報告した失敗の場合、メッセージはプラグインの生の失敗ペイロード(例: {"name":"world.failed",...})になります。Code: 行は正しい値です(既知の制限事項を参照)。ダイアログはモーダルであり、閉じられた後にプロセスが終了します。ランタイムでのエビデンス: 引数エラー、アクティブなセッションなし、ゲームプレイ前の失敗(ランタイムクロージャ T04)。

セッション、トレイ、終了#

OmsiLaunchW.exe が所有するセッションは、OmsiLaunch.exe が所有するセッションとまったく同じように動作します(セッションのライフサイクルを参照)。

  • トレイアイコンは、/spec ファイルで Presentation.SuppressTrayIcon が設定されていない限り、セッションが開始されるとすぐに、OMSI がゲームプレイに到達する前に表示されます。SuppressTrayIcon を設定した場合、目に見える表示はまったくありません。セッションは OmsiLaunch.exe session stop または OMSI を閉じることで停止してください。
  • セッションは、OMSI が終了したとき、トレイで End session(セッションを終了する項目)が確認されたとき、クライアントが session stop を送信したとき、または /observe-seconds が経過したときに終了します。その後 OmsiLaunch は、OMSI がまだ実行中であれば終了させ、変更したすべてのファイルを復元し、インストールリースを解放し、トレイアイコンを削除して終了します。
  • OmsiLaunchW.exe 自体が強制終了された場合は、そのインストール環境で次に OmsiLaunch を開始したときに、保留中のトランザクションがリカバリされます(トランザクションとリカバリを参照)。

クイックスタート#

  1. パッケージを OMSI 2 のディレクトリにインストールします(インストール)。
  2. セッションの引数(例: /new /map:maps\Grundorf\global.cfg /entrypoint-index:1)を指定した OmsiLaunchW.exe へのショートカットを作成します。
  3. それを起動します。OMSI はコンソールウィンドウなしで起動し、通知領域に OmsiLaunch のアイコンが表示されます。
  4. アイコンを右クリック → Status(ステータス表示の項目)でセッションを確認するか、End session → End session でセッションを終了します。
  5. 問題が発生した場合は、ダイアログにエラーコードが表示されます。詳細は <OMSI_PATH>\.omsilaunch\diagnostics にあります。