在vbscript中使用回调函数

问题描述 投票:0回答:2

我正在尝试在 vbscript 中为 windows7 制作更新脚本

调用 IUpdateSearcher::BeginSearch 时如何将回调传递给 ISearchCompletedCallback::Invoke Method

我只是对这一点一无所知:

  • 我需要一个函数或子函数还是一个带有调用方法的自定义对象(以及如何创建)
  • 我需要如何传递回调
  • 在 vbscript 中甚至有可能吗(如果不能,下一步是什么?)

谢谢

winapi vbscript callback
2个回答
0
投票

我从未尝试过,但我会看看 ConnectObject 方法。 这篇关于脚本事件的文章也可能有用。

所以也许是这样的(完全猜测):

Set objSession = CreateObject("Microsoft.Update.Session")
Set objSearcher = objSession.CreateUpdateSearcher
WScript.ConnectObject objSearcher, "searcherCallBack_"
objSearcher.BeginSearch ...


sub searcherCallBack_Invoke()
    ' handle the callback
end sub

我还建议阅读 异步 WUA 操作指南 以确保您自己清理。
该链接还提到使用

Windows Script Host
,所以绝对应该可以做到这一点,但除非你需要它是异步的,否则同步方法可能会更容易。


0
投票

VBscript 不能很好地处理回调。

我一直在使用 BeginSearchBeginDownloadBeginInstall 一段时间,解决方案是使用 iUnknown 的任何对象后代,并在其余代码中忽略它。

您必须使用返回对象iSearchJobiDownloadJobiInstallationJobIsCompleted属性,在调用EndSearchEndDownloadEndInstall之前验证操作是否已完成完成操作并检索有效结果。

你还应该实现一个超时函数来终止每个运行时间过长的操作。

这里是一个简单的例子(用 CScript 运行):

Dim strChars
    strChars = "-+|+"
If InStr(LCase(WScript.FullName),"cscript.exe") = 0 Then 
    WScript.Echo "This script requires to be run using CScript.exe"    
    WScript.Quit
End If
Set objUpdateSearcher = CreateObject("Microsoft.Update.Session").CreateUpdateSearcher()
WScript.Echo "Searching for new updates ..."
Set objSearchJob = objUpdateSearcher.BeginSearch ("", WScript , vbNull)
Do Until objSearchJob.IsCompleted
    WScript.Sleep 200
    WScript.StdOut.Write GetProgress & vbCr
Loop
Set objSearchResult = objUpdateSearcher.EndSearch (objSearchJob)
If objSearchResult.ResultCode = 2 Then
    If objSearchResult.Updates.Count = 0 Then
        WScript.Echo "No new updates."
    ElseIf objSearchResult.Updates.Count = 1 Then
        WScript.Echo "A new update is available."
    Else 
        WScript.Echo objSearchResult.Updates.Count & " new updates available."
    End If
Else
    WScript.Echo "Error while searching updates (Code: 0x" & Hex(objSearchResult.ResultCode) & ")"
End If
Function GetProgress
    GetProgress = Left(strChars,1)
    strChars = Right(strChars,Len(strChars)-1) & Left(strChars,1)
End Function
© www.soinside.com 2019 - 2024. All rights reserved.