次の方法で共有


サービスプログラムからアプリを起動するとウィンドウが表示されない

質問

2006年8月1日火曜日 12:03

VC++6でUSBメモリを挿入すると自動的にメモリ内のプログラム実行するアプリを作成しています。プログラムは2本構成で、ドライブが追加されたらそのドライブ内の特定のプログラムを実行するサービスプログラム(A)と、サービスプログラムから起動されて指定したプログラムを順次起動するプログラム(B)です。
ユーザーで動かすと目的通りに動作するのですが、サービスプログラム(A)を実際にサービスに登録してSYSTEMで実行させると、サービスから起動されたプログラム(B)と(B)から起動したプログラムは、タスクマネージャーには登録されるのですが、そのアプリのWindowが表示されません、ちなみにSPY++でWindowを見るとそれらしきWindowが見あたりません。
たとえば(B)からメモ帳を起動してもタスクマネージャーには表示されているが、Windowが表示されません。はじめはshellexecuteがだめなのかのと思い、Createprocessに変えましたが同じでした。
なにか別のデスクトップで表示しているような感じです。何か解決方法はあるでしょうか?
CreateProcessで使うSTARTUPINFOにはlpDesktopというパラメータがありますが、これは何でしょうか?
どなたかアドバイスお願いします。

 

 

 

 

 

 

すべての返信 (4)

2006年8月1日火曜日 15:04

サービスはデスクトップを持っていませんので当然です。

このような場合にはサービスの監視を行うCプログラムを作成しなくちゃいけないと思います。


2006年8月1日火曜日 23:49

 takashimatsumuro さんからの引用

サービスから起動されたプログラム(B)と(B)から起動したプログラムは

なにか別のデスクトップで表示しているような感じです。何か解決方法はあるでしょうか?
 

もっとも修正の少ない解決方法は、サービスのプロパティーの「ログオン」タブにある
「デスクトップとの対話をサービスに許可」のチェックをつけるとフォームが表示されるようになります。

しかし、この方法は WindowsVista では利用できません。
リモートデスクトップ接続で他のマシンからこのコンピュータに接続しているユーザにも表示されません。

 takashimatsumuro さんからの引用

ドライブが追加されたらそのドライブ内の特定のプログラムを実行するサービスプログラム(A)
 

USBメモリを挿したタイミングで、そのドライブにあるプログラムをローカルシステムアカウントで実行するなんて
私には恐ろしくてできません。

誰かに使ってもらうプログラムなら、サービスの監視を行うプログラムを作らなくちゃいけないと思います。

 


2006年8月2日水曜日 1:42

青柳です。

通常、サービスは別のデスクトップで動いています。そして、サービスから起動されたプロセスもこのデスクトップで動きます。このサービスのデスクトップはログインユーザのデスクトップとは別ですので画面上に表示されません。

http://support.microsoft.com/default.aspx?scid=kb;ja;173687
こちらの KB に一時的にログインユーザのデスクトップにアクセスするサンプルがあります。
ただ、一時的に切り替えて CreateProcess するとログインユーザのデスクトップで起動できるのかどうかはわかりません。

そもそも、誰もログインしていないときはどうなるんでしょ?また、ターミナルサービスなどで複数のユーザがログインしているような場合は誰のデスクトップにアクセスすればいいんでしょ?
普通は PC の電源が入ってる限り動き続けなくてはいけない部分をサービス、ユーザと対話する部分を別プロセスにして (必要があればスタートアップに入れて自動起動にして)、これらの間でプロセス間通信するっていうような感じの構成にするんじゃないかと思います。


2006年8月2日水曜日 11:57

返信する場所間違ったので、同じ内容コピーします。

みなさま、早速回答ありがとうございます。
VCはじめたばかりで、頭のなかでは動いているのですが、言語やOSが難しく、何かしようとするとすぐに壁にあたってしまいます。
という状態で、「このような場合にはサービスの監視を行うCプログラムを作成しなくちゃいけないと思います。」とはどのようなプログラムを作ったらいいのかよくわからない次第です....

K_Kazuさんのアドバイスのようにデスクトップとの対話をサービスに許可 をチェックすると表示できるようになったので、CreateService で自動設定するようにしてとりあえずは動きだしました。

Aoyagiさんのアドバイスにあるよう、RUNでもいいのですが、実行するプログラムにAdministratorの権限が必要でできれば、Userでログオンしているときでも動いてほしく、サービスで作ってしまいましたが、ログオンしていない(するまで)時にデバイスが挿入されたときは問題がありそうですね。

 本当は、USBを刺せばAutorunしてくれればいいのですが、CDROMは動いてもUSBは動かずで、U3プラットフォームやAPO USBというフリーウェアもあるそうなのですがどちらも派手なので、おとなしくAutorunしてほしくて作り始めました。

ということで、これからどのように正しいプログラムに直していけばいいのでしょうか?