none
Windowsサービスでのコーディング方法がよく分かりません。 RRS feed

  • 質問

  • 初めてVC++のWindowsサービスというものでプログラムを作っているのですが、コーディングの方法がよく分かりません。

    わたしがサービスでしたいことは、サービスを常に起動させておいて数分おきに今開かれているウィンドウの名前を記録して、ログファイルにするということです。

    新規にプロジェクトを作成するとMain関数が生成され、その中にServiceBase::Runと自動で記述されてます。

    そのほかにも別ファイルにOnStartやOnStop等がありました。

    Runが、サービスの起動。OnStartがサービスが起動した時に通る。OnStopがサービスが終了した時に通るものだと思いましたので、Runの後にループで数分おきにウィンドウを記録してログファイルにするコードを書きました。

    でも、実際にサービスを実行してもログをまったく書いてくれません。

    ちゃんと動いているように見えるのですが、コードの書く場所が悪いのでしょうか、わたしなりに色々と調べてみたけど分かりませんでした。

    こんな初心者的な質問でもうしわけないのですが、どなたか教えてくれませんか?

    2007年5月25日 8:24

すべての返信

  •  Tmaki さんからの引用

    ちゃんと動いているように見えるのですが、コードの書く場所が悪いのでしょうか、わたしなりに色々と調べてみたけど分かりませんでした。

     

    一応「ちゃんと動いている」として、ですが、Widnows サービスはデフォルトの構成ではログオンユーザのデスクトップとは切り離された状態で実行されています。

    (そもそも Windows サービスは、誰もログオンしていない状態でも動作するものですから)

     

    サービスの設定で「デスクトップとの対話を許可する」を有効にすれば、ログオンユーザのデスクトップにアクセスできるようになるはずです。

    (が、Vista では UAC の絡みで期待通りの動作をしないかもしれません)

     

    2007年5月25日 10:45
  • > (が、Vista では UAC の絡みで期待通りの動作をしないかもしれません)

    Windows Vistaでは、UACというかセキュリティ強化の一環で、
    サービスとドライバはSession 0 に分離される仕様となっています。


    ■Windows Vista でのサービスとドライバの Session 0 分離の影響 - MSDN
    http://www.microsoft.com/japan/whdc/system/vista/services.mspx

    2007年5月25日 11:30
  • もし相対パスでログをファイルに出力しているなら、相対パスの開始位置がEXEの存在するフォルダと思っていませんか?

     

    実際には、Windowsフォルダの下になります。

    (ごめんなさい、正確な位置を忘れました。確かWindows以下だったと・・・)

     

    そちらに書かれているのではないでしょうか?

    確認してみてください。

     

    2007年5月27日 23:46
  • みなさま、返信どうもありがとうございました。

    今回の環境はXPですので、そこのところは大丈夫だと思います。

    そうです。相対パスで指定していて、EXEの直下だけを確認していました。

    Windows以下に書かれているのですね。

    ちょっと探してみます!

    2007年5月28日 6:20
  • あれからログが書かれているところを探しても見つかりませんでした。

    そこで、違う原因ではないかと思って調べていましたら、サービスが起動されていませんでした。

    ちゃんと動いていませんでした。申し訳ありません。

    EXEをたたいたらコマンドラインが表示され、コードのRunに至るまでの処理は通るのですが、Run以下の処理が全く動作してくれませんし、サービスも起動してくれません。

    一体サービスのプログラムはどのような構造になっているのか分からなくなりました。

    2007年5月31日 0:36
  • 一体サービスのプログラムはどのような構造になっているのか分からなくなりました。

     

    以下のURLを参考にされては如何でしょうか。

     

    >> EZ-NET研究室 【成功版】 ATL でサービスプログラムを作ってみる

    > http://program.station.ez-net.jp/special/vc/atl/service_vc2003.asp

     

     書き込んで直後気がついたのが、作成は.NET環境だったのですね。

    .NETにしても構造自体は同様だと思いますが、PGは参考にならないです。

     

    >>  .NET Framework 開発用 方法 : Windows サービスを作成する 

    http://msdn2.microsoft.com/ja-jp/library/9k985bc9(VS.80).aspx

    案内すべきはこちらでした。m(_"_)m

    2007年5月31日 1:04
  • st.lainさん、ありがとうございます。

    わたしもmsdnも色々調べてたのですが、今回教えて頂いた部分含め、もう一度読み返してみました。

    それでちょっと気づいたのですが、ヘッダーファイルに「インストーラを追加」という作業をしていませんでした。

    それでインストーラを追加し、serviceInstaller1とserviceProcessInstaller1を作成しました。

    それぞれ設定をして、セットアッププロジェクトを作ってインストールしました。

    そしてインストールしたEXEをたたくと、以前まではサービスのRun以前までの処理しかしてくれなかったのがRun以後の処理も行ってくれました。

    しかし、「サービスはコマンドライン上から起動させることは出来ません」みたいなエラーが出て、閉じてしまいました。

     

    また調べてみたらInstallutil.exeを使用してサービスを起動させるというものを見つけたのですが。

    よくよく調べてみると、C++で作成したサービスはInstallutil.exeではサービスを配置することが出来ないと書かれていました。

    一歩進んだかなと思ったのですが、ここでまた詰まってしまいました。

    2007年5月31日 7:22
  • .Netサービスプログラムの登録は以下のサイトを参照されると良いかと思います。

     

    >> .NET Tips (VB.NET, C#, Visual Studio...)

    > http://dobon.net/vb/dotnet/index.html

    リンクから[デプロイメント]→[Windows Installer以外のインストーラ]の項になります。

     

    2007年6月1日 5:51