WSHをVB6に移植するには?

解決


tmkm  2006-10-30 23:05:27  No: 133916

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


大吉末吉  2006-10-31 20:46:31  No: 133917

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)・・・


tmkm  2006-10-31 23:42:41  No: 133918

大吉末吉さん、ありがとうございます。
以下のように変更してみましたが、
「プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません」
とエラーが出てしまいます。

オブジェクトブラウザで見ると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


大吉末吉  2006-11-01 00:20:00  No: 133919

tmkm  さん  こんにちは。

> 「プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません」
> とエラーが出てしまいます。

> オブジェクトブラウザで見るとOnObjectReadyの第一引数は SWbemObject型なので
> エラーになるのでしょうか?

ですね。
データ型はきちんと指定してください。

新規にイベントの雛形を作成すれば、
(つまり、一旦「objSink_OnObjectReady」の定義を削除して、
改めて、コードウィンドウ上部のプルダウンで「objSink」と
「OnObjectReady」を選択すれば、)
正しいデータ型でイベントの雛形が作成されるはずです。


tmkm  2006-11-01 23:43:51  No: 133920

無事解決できました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加