1

ビデオファイルで VLC を実行したい。

VS で次のコードを記述し、IIS Express で実行しました。IIS Express ではすべて問題なく、オーディオだけでなくビデオも見ることができます。

しかし、ローカル IIS に公開すると、タスク マネージャーで VLC.exe を確認でき、オーディオを聞くことはできますが、VLC プレーヤーを確認することはできません。

コードスニペット

        public bool LaunchVlC(string choice)
        {
          System.Diagnostics.Process VLC = new System.Diagnostics.Process();
          VLC.StartInfo.FileName = @"F:\VLC\vlc.exe";
          VLC.StartInfo.Arguments = "-vvv " + choice;
          VLC.Start();
          return true;
        }

IIS 管理サービスをローカル システム アカウントで実行し、サービスがデスクトップとやり取りできるようにしました。動画はまだ見れません。

4

1 に答える 1

1

コメント セクションの「Lex Li」で既に示されているように、セッション 0 で実行されているプロセス (ローカル IIS のアプリケーション) が UI を要求すると、UI はユーザー セッションに表示されません。ユーザーの観点からは、アプリケーションはハングしているように見えますが、実際にはアプリケーションはまったく正常に実行されており、ユーザーには表示されないユーザーの応答を辛抱強く待っています。

Windows Vista 以降では、セッション 0 がサービスとユーザー モード ドライバー用に作成されます。セッション 1 は、ログインする最初のユーザー用に作成されます。このユーザーのアプリケーションはセッション 1 で実行されます。

次の例を考えてみましょう。アプリケーションに属するサービスがセッション 0 で UI 要素を生成する場合、たとえばダイアログ ボックスでユーザーが [OK] または [キャンセル] をクリックするのを待っている場合、アプリケーションはサービスを待機しています。 UI はユーザー セッションに表示されません。ユーザーの観点からは、アプリケーションはハングしているように見えますが、実際にはアプリケーションはまったく正常に実行されており、ユーザーには表示されないユーザーの応答を辛抱強く待っています。

ご想像のとおり、これはユーザー、管理者、および開発者に問題をもたらします。ただし、考慮すべき簡単な緩和要因がいくつかあります。

  1. アプリケーションのサービスが UI を使用する場合、組み込みの軽減策 (Windows Vista 以降) により、ユーザーは特別なデスクトップでセッション 0 UI を操作できます。これにより、セッション 0 デスクトップ全体ではなく、アプリケーション固有の UI が使用可能になります。

  2. アプリケーションがグローバルな名前のオブジェクトを作成する場合は、Windows XP 互換モードを使用して、アプリケーションが引き続きセッション 0 サービスを使用できるようにします。

Windows Vista 以降との互換性についてアプリケーションをテストする場合は、次のテスト シナリオを考慮してください。

  1. ターミナル サーバー モードまたはユーザーの簡易切り替え (FUS) モードの Windows XP でアプリケーションをテストおよび検証します。これらのシナリオでアプリケーションが Windows XP で適切に動作する場合、Windows Vista でも動作する可能性が非常に高くなります。

  2. Window XP 互換モードを適用した後、アプリケーションが適切に機能することを確認します。これには、セッション 0 の問題の一部に対する軽減策が含まれています。

  3. ドライバーをテストして (Windows Vista 以降)、正しく動作することを確認します。それが不可能な場合は、FUS を有効にし、複数のユーザーがログオンしている Windows XP でドライバーをテストします。ドライバーが 2 番目以降のログオン ユーザーに対して正しく機能する場合は、Session 0 の変更による影響を受けない可能性があります (Windows Vista 以降)。このテストで検出されない唯一の問題は、セッション 0 (Windows Vista 以降) にビデオ ドライバーがないことに関連するものです。

最後に、次の Windows Vista 以降の機能ソリューションを活用できます。

  1. リモート プロシージャ コール (RPC) や名前付きパイプなどのクライアントまたはサーバー メカニズムを使用して、サービスとアプリケーション間の通信を行います。

  2. 関数を使用WTSSendMessageして、ユーザーのデスクトップに簡単なメッセージ ボックスを作成します。これにより、サービスはユーザーに通知を送信し、簡単な応答を要求できます。

  3. より複雑な UI の場合は、CreateProcessAsUser関数を使用して、ユーザーのセッションでプロセスを作成します。

  4. イベントやマップされたメモリなど、サービスによって使用可能になる名前付きオブジェクトに対して、Local\または名前空間のいずれかを明示的に選択します。Global\

これで、Session 0 の分離が Windows Vista 以降のアプリケーションの互換性にどのように影響するかを簡単に確認できます。


注 : Application Compatibility – Session 0 Isolationからコピー。詳細については、このリンクを確認してください。

于 2016-08-21T07:08:48.367 に答える