2011-12-08 32 views
12

những điều đầu tiên đầu tiên: Tôi không có kinh nghiệm trong lập trình hướng đối tượng, bất cứ điều gì. Tôi đã tạo phần chia sẻ các tập lệnh VB và một chút Java trong trường học, nhưng đó là nó. Vì vậy, vấn đề của tôi rất có thể nằm ở đó. Nhưng tuy nhiên, trong vài ngày qua, tôi đã cố gắng để có được một ứng dụng nhỏ với nhau cho phép tôi quét, chọn và cài đặt các bản cập nhật Windows. Cho đến nay tôi đã có thể hiểu hầu hết các tài liệu tham khảo và với sự giúp đỡ của một vài bài viết trên internet và bây giờ tôi đang ở thời điểm mà tôi có thể chọn và tải xuống các bản cập nhật.C# và WUAPI: BeginDownload chức năng

Cho đến nay tôi đã có thể tải về một tập hợp các thông tin cập nhật bằng cách sử dụng đoạn mã sau:

UpdateCollection CurrentInstallCollection = (UpdateCollection)e.Argument; 
UpdateDownloader CurrentDownloader = CurrentSession.CreateUpdateDownloader(); 
CurrentDownloader.Updates = CurrentInstallCollection; 

này được chạy trong một nền công nhân và trả về một lần tải về xong. Nó hoạt động tốt, tôi có thể thấy các bản cập nhật được tải xuống trên hệ thống tệp nhưng thực sự không có cách nào để hiển thị tiến trình trong ứng dụng. Để làm một điều như vậy, có giao diện IDownloadJob cho phép tôi sử dụng phương thức .BeginDownload của trình tải xuống (UpdateSession.CreateUpdateDownloader) ... tôi nghĩ, ít nhất. : D Và ở đây có vấn đề: Bây giờ tôi đã cố gắng trong khoảng 6 giờ để có được mã làm việc, nhưng không có vấn đề gì tôi đã cố gắng không có gì làm việc. Ngoài ra, không có nhiều thông tin xung quanh trên internet về các phương pháp .BeginDownload (hoặc ít nhất là có vẻ như cách mà), nhưng cuộc gọi của tôi về phương pháp này không làm việc:

IDownloadJob CurrentDownloadJob = CurrentDownloader.BeginDownload(); 

tôi không có đầu mối gì đối số để cung cấp ... Tôi đã thử phương pháp, đối tượng ... vô ích. Khối đầy đủ các mã trông như thế này:

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

Tôi đã tìm thấy một nguồn trên internet mà gọi là phương pháp với .BeginDownload(this,this,this), mà không báo cáo bất kỳ lỗi trong trình soạn thảo mã nhưng có lẽ sẽ không giúp với báo cáo vì nó là sự hiểu biết của tôi, rằng các đối số được cung cấp là các phương thức được gọi khi xảy ra sự kiện được mô tả (tiến trình đã thay đổi hoặc quá trình tải xuống đã hoàn tất).

Tôi cũng đã cố gắng này, nhưng nó đã không làm việc một trong hai:

http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/636a8399-2bc1-46ff-94df-a58cebfe688c

Mô tả chi tiết của phương pháp BeginDownload:

http://msdn.microsoft.com/en-us/library/aa386132(v=VS.85).aspx

WUAPI tham khảo:

Rất tiếc, tôi không được phép đăng liên kết nhưng liên kết đến phương thức BeginDownload đến cùng một nơi. :)

Tôi biết, đó là một chút để hỏi, nhưng nếu ai đó có thể chỉ cho tôi đi đúng hướng (như trong đó lập luận để vượt qua và làm thế nào), nó sẽ được rất nhiều đánh giá cao! :)

Trả lời

1

Thêm một tham chiếu đến WUApiLib

public UpdateSession updateSession; 
public ISearchResult searchResult; 

private void Form1_Load(object sender, EventArgs e) 
    { 
     //check for updates 
     updateSession = new UpdateSession(); 
     searchResult = updateSession.CreateUpdateSearcher().Search("IsInstalled=0 and Type='Software' and IsHidden=0"); 


     //download updates 
     UpdateDownloader downloader = updateSession.CreateUpdateDownloader(); 
     downloader.Updates = searchResult.Updates; 
     downloader.Download(); 

     //collect all downloaded updates 
     UpdateCollection updatesToInstall = new UpdateCollection(); 
     foreach (IUpdate update in searchResult.Updates) 
     { 
      if (update.IsDownloaded) 
      { 
       updatesToInstall.Add(update); 
      } 
     } 

     //install downloaded updates 
     IUpdateInstaller installer = updateSession.CreateUpdateInstaller(); 
     installer.Updates = updatesToInstall; 
     IInstallationResult installationRes = installer.Install(); 
    } 
+0

Bất cứ ai cũng biết cách đặt Ngôn ngữ của các bản cập nhật được tìm nạp? w/.Search ("IsInstalled = 0 AND IsPresent = 0"); Tôi nhận được tất cả các ngôn ngữ và tôi gần như đã đi Latvia nhưng đã có thể hủy bỏ. – DukeDidntNukeEm

3

Windows Update API (WU API Lib (WUApiLib)) cũng không phải là tài liệu theo ý kiến ​​của tôi. "Bắt đầu" không đồng bộ của tất cả các nhiệm vụ của Tìm kiếm, Tải xuống và Cài đặt được hiển thị bên dưới. Khó nắm bắt và tiếc là Microsoft đã không đưa ra bất kỳ mẫu mã C# nào trong giai đoạn này. Tôi hy vọng tôi có thể giúp với ứng dụng nhỏ của mình. Bộ luật có thể được tidied một chút, nó chỉ hack với nhau ở giai đoạn này nhưng nó phục vụ mục đích của nó.Bạn sẽ cần một Windows Form với bốn thành phần trên nó:

private System.Windows.Forms.TextBox textBox1; 
private System.ComponentModel.BackgroundWorker EnableServicesWorker; 
private System.Windows.Forms.Label toolStripStatusLabel2; 
private System.Windows.Forms.Label toolStripStatusLabel1; 

impliments Mã của tôi tất cả các thuộc tính async của quá trình tìm kiếm, tải về và cài đặt bản cập nhật từ trang web của Microsoft (Xin lỗi dài của nó):

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

} 
}