C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: NTSVC.ocxをVB2008で使用したい


(過去ログ 91 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■54472 / inTopicNo.1)  NTSVC.ocxをVB2008で使用したい
  
□投稿者/ サンプラザ (5回)-(2010/10/21(Thu) 18:01:26)

分類:[.NET 全般] 

開発環境:Windows XP
使用言語:Visual Studio 2008

現在、VB6からVB2008へコンバージョンを行っております。
VB6では、「NTSVC.ocx」を使用してサービス登録を行い使用していた為、
期限の関係上、VB2008でも同様に「NTSVC.ocx」を使用したいと考えております。

VB2008へコンバージョンしたアプリをサービス登録する事は出来たのですが、
サービス起動時に、以下のエラーメッセージが表示されます。

≪エラー≫
 エラー番号:1053
 エラー内容:そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。

インターネットで調べたところ、サービスの開始が正常に行われていない為にエラーが発生したようで、
以下に抜粋しています、「oNTService_Start」イベントが正常に起動していないように思います。
VB2008初心者の私だけでは中々解決策が見つかりません。

みなさんのお力添えをお願いいたします。


長くなり申し訳ありませんが、
以下にソースコードを抜粋いたします。

◆参照ocx
 NTSVC.ocx (インターネットからダウンロード)

◆参照設定
 AxInterop.NTService
 Interop.NTService

◆ソースコード
Private Sub frmMain_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
Dim strDisplayName As String
Dim sWork1 As String
Dim sWork2 As String
Dim aWork() As String
Dim nIndex As Short

strDisplayName = oNTService.DisplayName

If VB.Command() = "-install" Then

'サービス登録
oNTService.Interactive = True

If oNTService.Install Then
Call oNTService.SaveSetting("Parameters", "TimerInterval", CStr(1000 * 10))
MsgBox(strDisplayName & " installed successfully")
Else
MsgBox(strDisplayName & " failed to install")
End If
End

ElseIf VB.Command() = "-uninstall" Then
'サービス削除
If oNTService.Uninstall Then
MsgBox(strDisplayName & " uninstalled successfully")
Else
MsgBox(strDisplayName & " failed to uninstall")
End If
End

ElseIf VB.Command() = "" Then
'実行ファイル起動
oNTService.ControlsAccepted = NTService.SvcControls.svcCtrlPauseContinue

oNTService.StartService()

Else
MsgBox("Invalid command option")
End
End If

End Sub

  'サービス開始イベント
Private Sub oNTService_Start(ByVal eventSender As System.Object, ByVal e As AxNTService._DNtSvcEvents_StartEvent) Handles oNTService.Start
e.success = True
Call oNTService.LogEvent(NTService.SvcEventType.svcEventInformation, NTService.SvcEventId.svcMessageInfo, "サービスが開始されました")
End Sub

  'サービス終了イベント
Private Sub oNTService_Stop(ByVal eventSender As System.Object, ByVal e As System.EventArgs) Handles oNTService.Stop

Call oNTService.LogEvent(NTService.SvcEventType.svcEventInformation, NTService.SvcEventId.svcMessageInfo, "サービスが停止されました")

End Sub

引用返信 編集キー/
■54474 / inTopicNo.2)  Re[1]: NTSVC.ocxをVB2008で使用したい
□投稿者/ やじゅ (1767回)-(2010/10/21(Thu) 18:59:38)
やじゅ さんの Web サイト
No54472 (サンプラザ さん) に返信
> 現在、VB6からVB2008へコンバージョンを行っております。
> VB6では、「NTSVC.ocx」を使用してサービス登録を行い使用していた為、
> 期限の関係上、VB2008でも同様に「NTSVC.ocx」を使用したいと考えております。

NTSVC.ocx は、マイクロソフトでも既にサポート対象外となっています。
あきらめて「Windowsサービス」プロジェクトの作成で作り直した方がいいと思います。

Windowsサービスの作成手順(VB.NET 2005)
http://homepage2.nifty.com/nonnon/Chinamini/20080923.html

引用返信 編集キー/
■54476 / inTopicNo.3)  Re[1]: NTSVC.ocxをVB2008で使用したい
□投稿者/ 魔界の仮面弁士 (1884回)-(2010/10/21(Thu) 20:28:42)
No54472 (サンプラザ さん) に返信
> 期限の関係上、VB2008でも同様に「NTSVC.ocx」を使用したいと考えております。
NT Service コントロールは、そもそも unsupported な ocx (のソースコード)です。それも VB4 時代の。
「急がば回れ」で、VB.NET 向けの記述に改めた方が、無用なトラブルを防げると思いますよ。
http://www.itmedia.co.jp/enterprise/articles/0502/01/news083.html
http://msdn.microsoft.com/ja-jp/library/9k985bc9%28VS.80%29.aspx

# 付属の NTService.doc を見る限り、作者は http://blogs.msdn.com/b/mordonez/ のようですが、
# Word 文書のプロパティを見ると、http://blogs.msdn.com/b/bowerm/ になっている模様…。


> ≪エラー≫
>  エラー番号:1053
>  エラー内容:そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。
予想として:
・サービスの起動(終了)に予想より長い時間を要している。
・起動中にエラーが出て、処理が途中で止まっている。
・ユーザー応答を必要とする処理が発生して、その応答待ちになっている。
・どこかで End ステートメントが実行され、後始末が正常に行われていない。


> MsgBox(strDisplayName & " installed successfully")
MsgBox などの、ユーザー応答を必要とする機能を呼び出すのではなく、
代わりに、イベントログ等に記録するようにします。
NTSVC 付属のヘルプにも以下のように書かれていますよね。

『As a general rule, services should not depend on any user interaction.
 This includes handling all error conditions with On Error blocks
 to prevent error message boxes.』

(意訳)
 原則として、サービスはユーザー対話に依存すべきではありません。
 これは、すべての実行時エラーを On Error ステートメントで捕らえ、
 エラー時のメッセージボックスを防ぐ必要があるという事も意味しています。


なお、.NET でイベントログに記録する場合には、EventLog.WriteEntry メソッドを用いるか、
または Trace.WriteLine の出力を EventLogTraceListener 経由で記録するようにすれば OK です。


ちなみに VB6 の場合、イベントログへの記録には、App.LogEvent メソッドを使います。
(VB4 当時はそれが無かったので、NTSVC の LogEvent メソッドを使っていました)

# VB6 コンパイル オプションの「対話型インターフェイスの抑制」をチェックすることで、
# MsgBox 関数の呼出をイベントログへの記録へと変換させることもできます。
# もっとも、Form や UserControl を使っている場合はこの機能を利用できないのですけれども。
引用返信 編集キー/
■54482 / inTopicNo.4)  Re[2]: NTSVC.ocxをVB2008で使用したい
□投稿者/ サンプラザ (7回)-(2010/10/22(Fri) 09:17:26)
No54474 (やじゅ さん) に返信
> ■No54472 (サンプラザ さん) に返信
>>現在、VB6からVB2008へコンバージョンを行っております。
>>VB6では、「NTSVC.ocx」を使用してサービス登録を行い使用していた為、
>>期限の関係上、VB2008でも同様に「NTSVC.ocx」を使用したいと考えております。
>
> NTSVC.ocx は、マイクロソフトでも既にサポート対象外となっています。
> あきらめて「Windowsサービス」プロジェクトの作成で作り直した方がいいと思います。
>
> Windowsサービスの作成手順(VB.NET 2005)
> http://homepage2.nifty.com/nonnon/Chinamini/20080923.html

やじゅ様

ご回答ありがとうございます。
期限の関係上、「NTSVC.ocx」を使用して実装を行いたかったですが、
.NETで「Windowsサービス」を新規作成した方が良さそうなのですね。
今からさっそく.NETで「Windoesサービス」を作成してみます。

また行き詰まった際は、お力添えをよろしくお願いいたします。

解決済み
引用返信 編集キー/
■54484 / inTopicNo.5)  Re[2]: NTSVC.ocxをVB2008で使用したい
□投稿者/ サンプラザ (8回)-(2010/10/22(Fri) 09:36:21)
No54476 (魔界の仮面弁士 さん) に返信
> ■No54472 (サンプラザ さん) に返信
>>期限の関係上、VB2008でも同様に「NTSVC.ocx」を使用したいと考えております。
> NT Service コントロールは、そもそも unsupported な ocx (のソースコード)です。それも VB4 時代の。
> 「急がば回れ」で、VB.NET 向けの記述に改めた方が、無用なトラブルを防げると思いますよ。
> http://www.itmedia.co.jp/enterprise/articles/0502/01/news083.html
> http://msdn.microsoft.com/ja-jp/library/9k985bc9%28VS.80%29.aspx
>
> # 付属の NTService.doc を見る限り、作者は http://blogs.msdn.com/b/mordonez/ のようですが、
> # Word 文書のプロパティを見ると、http://blogs.msdn.com/b/bowerm/ になっている模様…。
>
>
>>≪エラー≫
>> エラー番号:1053
>> エラー内容:そのサービスは指定時間内に開始要求または制御要求に応答しませんでした。
> 予想として:
> ・サービスの起動(終了)に予想より長い時間を要している。
> ・起動中にエラーが出て、処理が途中で止まっている。
> ・ユーザー応答を必要とする処理が発生して、その応答待ちになっている。
> ・どこかで End ステートメントが実行され、後始末が正常に行われていない。
>
>
>>MsgBox(strDisplayName & " installed successfully")
> MsgBox などの、ユーザー応答を必要とする機能を呼び出すのではなく、
> 代わりに、イベントログ等に記録するようにします。
> NTSVC 付属のヘルプにも以下のように書かれていますよね。
>
> 『As a general rule, services should not depend on any user interaction.
>  This includes handling all error conditions with On Error blocks
>  to prevent error message boxes.』
>
> (意訳)
>  原則として、サービスはユーザー対話に依存すべきではありません。
>  これは、すべての実行時エラーを On Error ステートメントで捕らえ、
>  エラー時のメッセージボックスを防ぐ必要があるという事も意味しています。
>
>
> なお、.NET でイベントログに記録する場合には、EventLog.WriteEntry メソッドを用いるか、
> または Trace.WriteLine の出力を EventLogTraceListener 経由で記録するようにすれば OK です。
>
>
> ちなみに VB6 の場合、イベントログへの記録には、App.LogEvent メソッドを使います。
> (VB4 当時はそれが無かったので、NTSVC の LogEvent メソッドを使っていました)
>
> # VB6 コンパイル オプションの「対話型インターフェイスの抑制」をチェックすることで、
> # MsgBox 関数の呼出をイベントログへの記録へと変換させることもできます。
> # もっとも、Form や UserControl を使っている場合はこの機能を利用できないのですけれども。

魔界の仮面弁士様

いつも的確なご回答ありがとうございます。
やはり.NETの記述に改めた方が良さそうですね。
魔界の仮面弁士様のおっしゃる通り、「急がば回れ」の精神で
.NETの記述に改めようと思います。

また行き詰まった際は、お力添えをよろしくお願いいたします。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -