アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB2002+WIN2000を使用。

リモート端末へのアクセス前に起動確認処理としてPINGを使い、電源OFF時の待ち時間を減らしたいと考えています。

○PINGの他に導通確認できる手軽なものがあるのでしたら教えてください。

PINGの処理はネットで検索した結果C#(1.1)のものでしたら発見できたため、それを利用しようと思っています。(サイトでもVBへの変換は簡単にできるとあったので^_^;)

自分なりに変換してみましたがエラーが発生してしまい原因/対応方が分かりません。
ぜひご教授下さい。よろしくお願いいたします。
(補足が必要であれば記述します。)

【元からの変更】
・引数はなしにし、固定にしました。
・Button1の処理に記述しました。
・参照設定でSystem.Managementを追加しました。

【エラー】
スレッド '<名前がありません>' (0x59c) はコード 0 (0x0) で終了しました。
'System.Management.ManagementException' のハンドルされていない例外が system.management.dll で発生しました。

追加情報 : 無効なクラスです

【予想】
searcherにGetがない? 対策が分からず…


----- 変更プログラム ------

Imports System
Imports System.Management

Dim arg As String
arg = "192.168.0.1"
'クエリ文字列の設定()
Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher()
searcher = New ManagementObjectSearcher("select * from Win32_PingStatus where address = '" & arg & "'")

' クエリ結果のとりだし
Dim mo As ManagementObject

'エラー箇所
For Each mo In searcher.Get
Dim i As Integer
' 結果のプロパティのチェックと状態の表示
If mo.Properties("StatusCode").Value = "" Or Convert.ToInt32(mo.Properties("StatusCode").Value) <> 0 Then
Console.WriteLine(arg + ":稼働していません")
Else
Console.WriteLine(arg + ":稼働中")
Console.WriteLine("IPAddress:" & mo.Properties("ProtocolAddress").Value)
Console.WriteLine("ResponseTime:" & mo.Properties("ResponseTime").Value)
End If
Next
Console.WriteLine("----------------")


------ 元プログラム(C#) ----------------------

using System;
using System.Management;

class PingExec
{
public static void Main(string[] args) {

if(args.Length > 0)
{
foreach(string arg in args)
{
// クエリ文字列の設定
ManagementObjectSearcher searcher
= new ManagementObjectSearcher(
"select * from Win32_PingStatus where address = '"
+ arg + "'");
// クエリ結果のとりだし
foreach( ManagementObject mo in searcher.Get() )
{
// 結果のプロパティのチェックと状態の表示
if(mo.Properties["StatusCode"].Value == null
|| Convert.ToInt32(mo.Properties["StatusCode"].Value)
!= 0)
{
Console.WriteLine(arg + ":稼働していません");
}
else
{
Console.WriteLine(arg + ":稼働中");
Console.WriteLine("IPAddress:"
+ mo.Properties["ProtocolAddress"].Value);
Console.WriteLine("ResponseTime:"
+ mo.Properties["ResponseTime"].Value);
}
}
Console.WriteLine("----------------");
}
}
}
}

A 回答 (2件)

.NET 3.5 Beta 2での検証を行いました。

.NET 1.1では行っておりませんのでご了承ください。
[C#]
mo.Properties["StatusCode"].Value == null
[VB.NET]
mo.Properties("StatusCode").Value = ""

nullと空文字列(String型)は同じではなく,
比較できません。

VB.NETではnullではなくNothingを使います。
Nothingと比較する際,演算子として参照比較演算子Isを用います。
=だと実体が同じではないので,falseを返してしまうでしょう。

#色々うだうだ述べて間違ってたら恥ずかしいので削除
#でも、うちの場合InvalidCastExceptionが出たので違うかも

===========実際に動作したサンプル============

Imports System
Imports System.Management

Class Q3484121 'きちんとクラス名は書こう

Shared Sub Main 'Mainもきちんと書こう
Dim arg As String
arg = "127.0.0.1"
'クエリ文字列の設定()
Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher()
searcher = New ManagementObjectSearcher("select * from Win32_PingStatus where address = '" & arg & "'")

' クエリ結果のとりだし
Dim mo As ManagementObject

'エラー箇所
For Each mo In searcher.Get
' 結果のプロパティのチェックと状態の表示
'himajin100000は自信がないので演算子Orが優先されないように括弧で括ってる
If (mo.Properties("StatusCode").Value Is Nothing) Or (Convert.ToInt32(mo.Properties("StatusCode").Value) <> 0) Then
Console.WriteLine(arg + ":稼働していません")
Else
Console.WriteLine(arg + ":稼働中")
Console.WriteLine("IPAddress:" & mo.Properties("ProtocolAddress").Value)
Console.WriteLine("ResponseTime:" & mo.Properties("ResponseTime").Value)
End If
Next
Console.WriteLine("----------------")
End Sub

End Class

'.NET 2.0以降
'http://msdn2.microsoft.com/en-us/library/system. …

'その他,Process.Startでpingを実行(ぉ
    • good
    • 0

Win32_PingStatus クラスはWin2000で使用できないですよ



ちなみにWin2000では、WMISQLにてWhere句は使用できません
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!