我正在尝试在 vbscript 中为 windows7 制作更新脚本
调用 IUpdateSearcher::BeginSearch 时如何将回调传递给 ISearchCompletedCallback::Invoke Method?
我只是对这一点一无所知:
谢谢
我从未尝试过,但我会看看 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
,所以绝对应该可以做到这一点,但除非你需要它是异步的,否则同步方法可能会更容易。
VBscript 不能很好地处理回调。
我一直在使用 BeginSearch、BeginDownload 和 BeginInstall 一段时间,解决方案是使用 iUnknown 的任何对象后代,并在其余代码中忽略它。
您必须使用返回对象iSearchJob、iDownloadJob或iInstallationJob的IsCompleted属性,在调用EndSearch、EndDownload或EndInstall之前验证操作是否已完成完成操作并检索有效结果。
你还应该实现一个超时函数来终止每个运行时间过长的操作。
这里是一个简单的例子(用 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