- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
首先,我没有任何面向对象编程的经验。我在学校创建了我的 VB 脚本和一些 Java,仅此而已。所以我的问题很可能就在那里。但是尽管如此,在过去的几天里,我一直在尝试整合一个小应用程序,让我可以扫描、选择和安装 Windows 更新。到目前为止,借助互联网上的一些帖子,我已经能够理解大部分引用资料,现在我可以选择和下载更新。
到目前为止,我已经能够使用以下代码下载一组更新:
UpdateCollection CurrentInstallCollection = (UpdateCollection)e.Argument;
UpdateDownloader CurrentDownloader = CurrentSession.CreateUpdateDownloader();
CurrentDownloader.Updates = CurrentInstallCollection;
这在后台工作程序中运行,并在下载完成后返回。它工作得很好,我可以看到更新正在文件系统上下载,但实际上没有办法在应用程序中显示进度。要做到这一点,IDownloadJob 接口(interface)允许我使用下载器的 .BeginDownload
方法。
UpdateSession.CreateUpdateDownloader
我认为,至少。问题来了:我现在已经尝试了大约 6 个小时来让代码正常工作,但无论我尝试什么都没有效果。此外,互联网上没有太多关于 .BeginDownload
方法的信息(或者至少看起来是这样),但我对该方法的调用不起作用:
IDownloadJob CurrentDownloadJob = CurrentDownloader.BeginDownload();
我不知道要提供什么论据。我试过方法、对象……都无济于事。完整的代码块如下所示:
UpdateCollection CurrentInstallCollection = (UpdateCollection)e.Argument;
UpdateDownloader CurrentDownloader = CurrentSession.CreateUpdateDownloader();
CurrentDownloader.Updates = CurrentInstallCollection;
IDownloadJob CurrentDownloadJob = CurrentDownloader.BeginDownload();
IDownloadProgress CurrentJobProgess = CurrentDownloadJob.GetProgress();
tbStatus.Text = Convert.ToString(CurrentJobProgess.PercentComplete);
我在 Internet 上找到了一个使用 .BeginDownload(this, this, this)
调用该方法的资源,它不会在代码编辑器中报告任何错误,但可能无济于事根据我的理解,报告提供的参数是在描述的事件发生时调用的方法(进度已更改或下载已完成)。
我也试过这个,但也没用:
http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/636a8399-2bc1-46ff-94df-a58cebfe688c
BeginDownload方法的详细说明:
http://msdn.microsoft.com/en-us/library/aa386132(v=VS.85).aspx
WUAPI 引用:
不幸的是,我不允许发布链接,但指向 BeginDownload
方法的链接指向同一个地方。
我知道,这个问题有点多,但如果有人能为我指出正确的方向(比如传递哪些参数以及如何传递),我将不胜感激。
最佳答案
在我看来,Windows Update API (WU API Lib (WUApiLib)) 没有很好的文档记录。搜索、下载和安装的所有任务的异步“开始”如下所示。它很难掌握,不幸的是,微软在此阶段没有提供任何 C# 代码示例。我希望我能帮助我的小应用程序。该代码可以稍微整理一下,它只是在这个阶段被拼凑在一起,但它达到了它的目的。您将需要一个包含四个组件的 Windows 窗体:
private System.Windows.Forms.TextBox textBox1;
private System.ComponentModel.BackgroundWorker EnableServicesWorker;
private System.Windows.Forms.Label toolStripStatusLabel2;
private System.Windows.Forms.Label toolStripStatusLabel1;
我的代码实现了从 Microsoft 网站搜索、下载和安装更新的过程的所有异步属性(抱歉太长了):
using System;
using WUApiLib;
using System.Data;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.ServiceProcess;
using System.Collections.Generic;
namespace Windows_Update_Automation
{
public partial class Form1 : Form
{
public UpdateSession UpdateSession;
#region <------- Search Section ------->
public IUpdateSearcher iUpdateSearcher;
public ISearchJob iSearchJob;
public UpdateCollection NewUpdatesCollection;
public ISearchResult NewUpdatesSearchResult;
#endregion <------- Search Section ------->
#region <------- Downloader Section ------->
public IUpdateDownloader iUpdateDownloader;
public IDownloadJob iDownloadJob;
public IDownloadResult iDownloadResult;
#endregion <------- Downloader Section ------->
#region <------- Installer Section ------->
public IUpdateInstaller iUpdateInstaller;
public IInstallationJob iInstallationJob;
public IInstallationResult iInstallationResult;
#endregion <------- Installer Section ------->
// Declare a Delegate Type for Message Notification...
public delegate void SendNotification();
// Create an Instance of Delegate Type...
public SendNotification sendNotification;
private int count = 0;
public int Count
{
get { return count; }
set { count = value; }
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Show - or Hide...
this.Show();
// Encapsulate the setTextBox1 Method in Delegate SendNotification...
sendNotification = new SendNotification(setTextBox1);
// Set Text Box Value...
this.toolStripStatusLabel1.Text = "Enabling Update Services...";
// Set Text Box Value...
this.toolStripStatusLabel2.Text = "";
// Lets check Windows is up to that task...
EnableServicesWorker.RunWorkerAsync();
}
private void EnableServicesWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Get Services Collection...
ServiceController[] serviceController;
serviceController = ServiceController.GetServices();
// Loop through and check for a particular Service...
foreach (ServiceController scTemp in serviceController)
{
switch (scTemp.DisplayName)
{
case "Windows Update":
RestartService(scTemp.DisplayName, 5000);
break;
case "Automatic Updates":
RestartService(scTemp.DisplayName, 5000);
break;
default:
break;
}
}
// Check for iAutomaticUpdates.ServiceEnabled...
IAutomaticUpdates iAutomaticUpdates = new AutomaticUpdates();
if (!iAutomaticUpdates.ServiceEnabled)
{
iAutomaticUpdates.EnableService();
}
}
private void EnableServicesWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.toolStripStatusLabel1.Text = "Searching for updates...";
iUpdateSearch();
}
public static void RestartService(string serviceName, int timeoutMilliseconds)
{
ServiceController serviceController = new ServiceController(serviceName);
try
{
int millisec1 = Environment.TickCount;
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
serviceController.Stop();
serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
// count the rest of the timeout
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));
serviceController.Start();
serviceController.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch
{
// ...
}
}
#region <------- Search Methods ------->
private void iUpdateSearch()
{
UpdateSession = new UpdateSession();
iUpdateSearcher = UpdateSession.CreateUpdateSearcher();
// Only Check Online..
iUpdateSearcher.Online = true;
// Begin Asynchronous IUpdateSearcher...
iSearchJob = iUpdateSearcher.BeginSearch("IsInstalled=0 AND IsPresent=0", new iUpdateSearcher_onCompleted(this), new iUpdateSearcher_state(this));
}
private void iUpdateSearchComplete(Form1 mainform)
{
Form1 formRef = mainform;
// Declare a new UpdateCollection and populate the result...
NewUpdatesCollection = new UpdateCollection();
NewUpdatesSearchResult = iUpdateSearcher.EndSearch(iSearchJob);
Count = NewUpdatesSearchResult.Updates.Count;
formRef.Invoke(formRef.sendNotification);
// Accept Eula code for each update
for (int i = 0; i < NewUpdatesSearchResult.Updates.Count; i++)
{
IUpdate iUpdate = NewUpdatesSearchResult.Updates[i];
if (iUpdate.EulaAccepted == false)
{
iUpdate.AcceptEula();
}
NewUpdatesCollection.Add(iUpdate);
}
foreach (IUpdate update in NewUpdatesSearchResult.Updates)
{
textBox1.AppendText(update.Title + Environment.NewLine);
}
if (NewUpdatesSearchResult.Updates.Count > 0)
{
iUpdateDownload();
}
}
#endregion <------- Search Methods ------->
#region <------- Downloader Methods ------->
private void iUpdateDownload()
{
UpdateSession = new UpdateSession();
iUpdateDownloader = UpdateSession.CreateUpdateDownloader();
iUpdateDownloader.Updates = NewUpdatesCollection;
iUpdateDownloader.Priority = DownloadPriority.dpHigh;
iDownloadJob = iUpdateDownloader.BeginDownload(new iUpdateDownloader_onProgressChanged(this), new iUpdateDownloader_onCompleted(this), new iUpdateDownloader_state(this));
}
public void iDownloadComplete()
{
iDownloadResult = iUpdateDownloader.EndDownload(iDownloadJob);
if (iDownloadResult.ResultCode == OperationResultCode.orcSucceeded)
{
this.toolStripStatusLabel1.Text = "Installing Updates...";
iInstallation();
}
else
{
string message = "The Download has failed: " + iDownloadResult.ResultCode + ". Please check your internet connection then Re-Start the application.";
string caption = "Download Failed!";
MessageBoxButtons buttons = MessageBoxButtons.OK;
MessageBoxIcon icon = MessageBoxIcon.Error;
MessageBox.Show(message, caption, buttons, icon);
Application.Exit();
}
}
#endregion <------- Downloader Methods ------->
#region <------- Installation Methods ------->
public void iInstallation()
{
iUpdateInstaller = UpdateSession.CreateUpdateInstaller() as IUpdateInstaller;
iUpdateInstaller.Updates = this.NewUpdatesCollection;
iInstallationJob = iUpdateInstaller.BeginInstall(new iUpdateInstaller_onProgressChanged(this), new iUpdateInstaller_onCompleted(this), new iUpdateInstaller_state(this));
}
public void iInstallationComplete()
{
iInstallationResult = iUpdateInstaller.EndInstall(iInstallationJob);
if (iInstallationResult.ResultCode == OperationResultCode.orcSucceeded)
{
this.toolStripStatusLabel1.Text = "Installation Complete...";
}
else
{
string message = "The Installation has failed: " + iInstallationResult.ResultCode + ".";
string caption = "DownInstallationload Failed!";
MessageBoxButtons buttons = MessageBoxButtons.OK;
MessageBoxIcon icon = MessageBoxIcon.Error;
MessageBox.Show(message, caption, buttons, icon);
Application.Exit();
}
}
#endregion <------- Installation Methods ------->
#region <------- Notification Methods ------->
public void setTextBox1()
{
toolStripStatusLabel1.Text = Count + " Updates found...";
}
public void setTextBox1Notification(string txt)
{
toolStripStatusLabel1.Text = txt;
}
public void setTextBox2Notification(string txt)
{
toolStripStatusLabel2.Text = txt;
}
#endregion <------- Notification Methods ------->
#region <------- iUpdateSearcher.BeginDownload Object Abstract Class's ------->
// onCompleted [in]
// An ISearchCompletedCallback interface that is called when an asynchronous search operation is complete.
public class iUpdateSearcher_onCompleted : ISearchCompletedCallback
{
private Form1 form1;
public iUpdateSearcher_onCompleted(Form1 mainForm)
{
this.form1 = mainForm;
}
// Implementation of IDownloadCompletedCallback interface...
public void Invoke(ISearchJob searchJob, ISearchCompletedCallbackArgs e)
{
form1.iUpdateSearchComplete(this.form1);
}
}
// state [in]
// The caller-specific state that is returned by the AsyncState property of the ISearchJob interface.
public class iUpdateSearcher_state
{
private Form1 form1;
// Implementation of state interface...
public iUpdateSearcher_state(Form1 mainForm)
{
this.form1 = mainForm;
form1.setTextBox2Notification("State: Search Started...");
}
}
#endregion <------- iUpdateSearcher.BeginDownload Object Abstract Class's ------->
#region <------- iUpdateDownloader.BeginDownload Object Abstract Class's ------->
// onProgressChanged [in]
// An IDownloadProgressChangedCallback interface that is called periodically for download progress changes before download is complete.
public class iUpdateDownloader_onProgressChanged : IDownloadProgressChangedCallback
{
private Form1 form1;
public iUpdateDownloader_onProgressChanged(Form1 mainForm)
{
this.form1 = mainForm;
}
// Implementation of IDownloadProgressChangedCallback interface...
public void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs e)
{
decimal bDownloaded = ((e.Progress.TotalBytesDownloaded / 1024) / 1024);
decimal bToDownloaded = ((e.Progress.TotalBytesToDownload / 1024) / 1024);
bDownloaded = decimal.Round(bDownloaded, 2);
bToDownloaded = decimal.Round(bToDownloaded, 2);
form1.setTextBox1Notification("Downloading Update: "
+ e.Progress.CurrentUpdateIndex
+ "/"
+ downloadJob.Updates.Count
+ " - "
+ bDownloaded + "Mb"
+ " / "
+ bToDownloaded + "Mb");
}
}
// onCompleted [in]
// An IDownloadCompletedCallback interface (C++/COM) that is called when an asynchronous download operation is complete.
public class iUpdateDownloader_onCompleted : IDownloadCompletedCallback
{
private Form1 form1;
public iUpdateDownloader_onCompleted(Form1 mainForm)
{
this.form1 = mainForm;
}
// Implementation of IDownloadCompletedCallback interface...
public void Invoke(IDownloadJob downloadJob, IDownloadCompletedCallbackArgs e)
{
form1.iDownloadComplete();
}
}
// state [in]
// The caller-specific state that the AsyncState property of the IDownloadJob interface returns.
// A caller may use this parameter to attach a value to the download job object.
// This allows the caller to retrieve custom information about that download job object at a later time.
public class iUpdateDownloader_state
{
private Form1 form1;
// Implementation of state interface...
public iUpdateDownloader_state(Form1 mainForm)
{
this.form1 = mainForm;
form1.setTextBox2Notification("State: Download Started...");
}
}
#endregion <------- iUpdateDownloader.BeginDownload Objects ------->
#region <------- iUpdateInstaller.BeginInstall Object Abstract Class's ------->
// onProgressChanged [in]
// An IDownloadProgressChangedCallback interface that is called periodically for download progress changes before download is complete.
public class iUpdateInstaller_onProgressChanged : IInstallationProgressChangedCallback
{
private Form1 form1;
public iUpdateInstaller_onProgressChanged(Form1 mainForm)
{
this.form1 = mainForm;
}
// Implementation of IDownloadProgressChangedCallback interface...
public void Invoke(IInstallationJob iInstallationJob, IInstallationProgressChangedCallbackArgs e)
{
form1.setTextBox1Notification("Installing Update: "
+ e.Progress.CurrentUpdateIndex
+ " / "
+ iInstallationJob.Updates.Count
+ " - "
+ e.Progress.CurrentUpdatePercentComplete + "% Complete");
}
}
// onCompleted [in]
// An IDownloadCompletedCallback interface (C++/COM) that is called when an asynchronous download operation is complete.
public class iUpdateInstaller_onCompleted : IInstallationCompletedCallback
{
private Form1 form1;
public iUpdateInstaller_onCompleted(Form1 mainForm)
{
this.form1 = mainForm;
}
// Implementation of IDownloadCompletedCallback interface...
public void Invoke(IInstallationJob iInstallationJob, IInstallationCompletedCallbackArgs e)
{
form1.iInstallationComplete();
}
}
// state [in]
// The caller-specific state that the AsyncState property of the IDownloadJob interface returns.
// A caller may use this parameter to attach a value to the download job object.
// This allows the caller to retrieve custom information about that download job object at a later time.
public class iUpdateInstaller_state
{
private Form1 form1;
// Implementation of state interface...
public iUpdateInstaller_state(Form1 mainForm)
{
this.form1 = mainForm;
form1.setTextBox2Notification("State: Installation Started...");
}
}
#endregion <------- iUpdateInstaller.BeginInstall Objects ------->
关于C# 和 WUAPI : BeginDownload function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8432767/
首先,我没有任何面向对象编程的经验。我在学校创建了我的 VB 脚本和一些 Java,仅此而已。所以我的问题很可能就在那里。但是尽管如此,在过去的几天里,我一直在尝试整合一个小应用程序,让我可以扫描、选
我可以访问 Connected Renci.SshNet.SftpClient,我用它来获取 sftp 文件夹中的一系列文件。用于此的功能是 Renci.SshNet.SftpClient.ListD
我是一名优秀的程序员,十分优秀!