none
WebアプリケーションでのFindWindowについて RRS feed

  • 質問

  • WebアプリケーションでFindWindowを使用して
    MFCアプリケーションのウインドウハンドルを取得しようと思っています。

    IIS 5.1の場合、IIS Adminサービスのデスクトップとの対話を許可し、
    machine.configでユーザとパスワードを指定することで
    何とか取得できる様になったのですが、
    IIS 6.0の場合、同じ方法が使えないので困っています。
    (IIS6.0なら互換モードを使用すれば動くのですが、できればIIS 7.0でも動かしたいとの事で)

    アプリケーションプールでユーザとパスワードを指定して、
    w3wp.exeを指定したユーザで起動する所まではできたのですが、
    IIS Adminサービスの「デスクトップとの対話をサービスに許可」にチェックを入れても
    FindWindowでウインドウハンドルを取得できません。

    この現象の解決方法はありますでしょうか?


    開発環境 :VS 2005(ASP.NET C#)
    2010年4月23日 6:33

回答

  • サービスと MFC アプリのユーザー セッションが異なっているのではないでしょうか?
    IIS 6.0 ということは Windows Server 2003 だと思いますが、
    ターミナル サービスの関係で MFC アプリがセッション 0 以外で動作しているかもしれません。(サービスはセッション 0)
    IIS 5.1 (XP ですね) の環境でも、ユーザーの管理切り替えをすると、たちまち動かなくなる可能性があります。

     [HOW TO] Windows XP でユーザーの簡易切り替えをサポートするアプリケーションの作成方法
     http://support.microsoft.com/kb/310153/ja

     ... FindWindow または FindWindowEx を使用する従来の方法は、異なるユーザー セッションで (異なるデスクトップ上で) 実行されている
     アプリケーション インスタンスを検出できないため、ユーザーの簡易切り替えが有効になっている Windows XP システムでは正しい結果が得られません。...

    IIS 7.0 でも動かしたいとのことですが、Vista & Windows Server 2008 以降はセッション 0 分離が導入されているため、
    FindWindow のままでは確実に動かなくなります。

     ユーザーの簡易切り替え: 支援技術 ベンダが注意すべき問題点
     http://msdn.microsoft.com/ja-jp/library/cc421553.aspx

     セッション 0 の分離 - Windows 7 対応アプリケーションの互換性
     http://msdn.microsoft.com/ja-jp/windows/dd871151.aspx

    RPC やら名前付きパイプやらを使って、MFC アプリの方からサービスにウィンドウ ハンドルを伝えるという方法は取れませんか?
    • 回答としてマーク kou7 2010年4月26日 4:24
    2010年4月23日 10:24

すべての返信

  • サービスと MFC アプリのユーザー セッションが異なっているのではないでしょうか?
    IIS 6.0 ということは Windows Server 2003 だと思いますが、
    ターミナル サービスの関係で MFC アプリがセッション 0 以外で動作しているかもしれません。(サービスはセッション 0)
    IIS 5.1 (XP ですね) の環境でも、ユーザーの管理切り替えをすると、たちまち動かなくなる可能性があります。

     [HOW TO] Windows XP でユーザーの簡易切り替えをサポートするアプリケーションの作成方法
     http://support.microsoft.com/kb/310153/ja

     ... FindWindow または FindWindowEx を使用する従来の方法は、異なるユーザー セッションで (異なるデスクトップ上で) 実行されている
     アプリケーション インスタンスを検出できないため、ユーザーの簡易切り替えが有効になっている Windows XP システムでは正しい結果が得られません。...

    IIS 7.0 でも動かしたいとのことですが、Vista & Windows Server 2008 以降はセッション 0 分離が導入されているため、
    FindWindow のままでは確実に動かなくなります。

     ユーザーの簡易切り替え: 支援技術 ベンダが注意すべき問題点
     http://msdn.microsoft.com/ja-jp/library/cc421553.aspx

     セッション 0 の分離 - Windows 7 対応アプリケーションの互換性
     http://msdn.microsoft.com/ja-jp/windows/dd871151.aspx

    RPC やら名前付きパイプやらを使って、MFC アプリの方からサービスにウィンドウ ハンドルを伝えるという方法は取れませんか?
    • 回答としてマーク kou7 2010年4月26日 4:24
    2010年4月23日 10:24
  • 回答ありがとうございます。

    MFCアプリのセッションIDを確認しましたが、
    0で動いているようでした。

    XPのユーザの簡易切替機能を有効にして試してみましたが、
    こちらは問題なく動くようです。

    なんとなくですが、
    IIS Adminサービスのデスクトップとの対話を許可しない状態
    (MFCアプリは通常のデスクトップで動作し、
     Webアプリはサービス用のデスクトップで動作している状態)に
    なっているのではないかと思っております。

    解決が難しいようでしたら、提案いただいた方法や、
    ソケットの実装などを考えてみようと思います。
    2010年4月26日 2:18
  • MFCアプリのセッションIDを確認しましたが、
    0で動いているようでした。

    XPのユーザの簡易切替機能を有効にして試してみましたが、
    こちらは問題なく動くようです。
    これが問題なく動いてはいけません。
    2人目以降でログオンしたユーザーで MFC アプリを起動すると、FindWindow できなくなるはずです。
    何か手順が違っているのでしょうか?

     ・ユーザーの簡易切替機能を有効にする。
     ・1人目のユーザーでログオンする。
     ・ユーザーを切り替えて、2人目のユーザーでログオンする。
     ・2人目のユーザーのデスクトップで MFC アプリを起動する。
     ・タスク マネージャーの「列の選択」で「セッション ID」を有効にする。
     ・MFC アプリがセッション 0 以外で起動していることを確認する。


    なんとなくですが、
    IIS Adminサービスのデスクトップとの対話を許可しない状態
    (MFCアプリは通常のデスクトップで動作し、
     Webアプリはサービス用のデスクトップで動作している状態)に
    なっているのではないかと思っております
    これぞまさに Session 0 の分離なのですが。
    2010年4月26日 2:53
  • なるほど。
    当方の理解不足でした。
    確認したのは以下の手順でした。

    ・ユーザーの簡易切替機能を有効にする。
    ・1人目のユーザーでログオンする。
    ・タスク マネージャーの「列の選択」で「セッション ID」を有効にする。
    ・MFC アプリがセッション 0 で起動していることを確認する。

    記載いただいた手順で、
    セッション0以外で起動することを確認しました。


    Vistaや2008はまだ実際に触った事がなかったので、
    セッション0分離に関する話は今回初めて知りました。

    今後のことを考えると、Web側でのウインドウハンドルの取得は
    あきらめた方が良さそうですね。

    ありがとうございました。

    2010年4月26日 4:24