WSHで動いている以下のコードをVBのアプリで使いたいと思っています。
Const POPUP_DURATION = 120
Const OK_BUTTON = 0
strComputer = "servername"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.ExecQueryAsync objSink, "Select * from Win32_ComputerSystem"
msgbox "処理終了"
Sub SINK_OnObjectReady(objEvent, objAsyncContext)
Wscript.Echo objEvent.username
End Sub
これをVB6に移したいのですが、CreateObjectの第2引数が設定できないため
うまくいきません。
以下VBで書いたコードです。
Const POPUP_DURATION = 120
Const OK_BUTTON = 0
Private Sub Command1_Click()
strComputer = "servername"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSink = CreateObject("WbemScripting.SWbemSink", "SINK_")
objWMIService.ExecQueryAsync objSink, "Select * from Win32_ComputerSystem"
End Sub
Sub SINK_OnObjectReady(objEvent, objAsyncContext)
Debug.Print objEvent.username
End Sub
これを実行するとVBのCreateObjectはサーバー名なのでリモートサーバーがないと
言うエラーが出ます。
うまく移植する方法はないでしょうか?
環境
WindowsXP SP2
Visual Basic 6
tmkm さん こんにちは。
VB6では、レイトバインドのオブジェクトに対する
イベント処理はできないので、このまま無理なのでは・・・
アーリーバインドにしてみてはどうでしょう?
レジストリを見ると、「WbemScripting.SWbemSink」の実体は
「C:\WINDOWS\System32\wbem\wbemdisp.dll」の様です。
で、
「C:\WINDOWS\System32\wbem\」を探すと、タイプライブラリ「wbemdisp.tlb」があるようなので、
このファイルを参照設定して、
General領域で「Private WithEvents objSink As SWbemSink」の様に
イベント用の変数宣言しておく。
とか・・・
#当然、CreateObjectに第二引数は不要、
#イベント名は変数名を使う(objSink_OnObjectReady)・・・
大吉末吉さん、ありがとうございます。
以下のように変更してみましたが、
「プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません」
とエラーが出てしまいます。
オブジェクトブラウザで見るとOnObjectReadyの第一引数は SWbemObject型なので
エラーになるのでしょうか?
Private WithEvents objSink As SWbemSink
Const POPUP_DURATION = 120
Const OK_BUTTON = 0
Private Sub Command1_Click()
strComputer = "servername"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
objWMIService.ExecQueryAsync objSink, "Select * from Win32_ComputerSystem"
Debug.Print "test"
End Sub
Sub objSink_OnObjectReady(objEvent, objAsyncContext)
Debug.Print objEvent.UserName
End Sub
tmkm さん こんにちは。
> 「プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません」
> とエラーが出てしまいます。
> オブジェクトブラウザで見るとOnObjectReadyの第一引数は SWbemObject型なので
> エラーになるのでしょうか?
ですね。
データ型はきちんと指定してください。
新規にイベントの雛形を作成すれば、
(つまり、一旦「objSink_OnObjectReady」の定義を削除して、
改めて、コードウィンドウ上部のプルダウンで「objSink」と
「OnObjectReady」を選択すれば、)
正しいデータ型でイベントの雛形が作成されるはずです。
無事解決できました。
ありがとうございました。
ツイート | ![]() |