471,602 Members | 1,293 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,602 software developers and data experts.

Problem understanding/using COM WAU API from C#[error:bad variabletype]

Hi All !

Sorry for my crossposting, I am not completely sure about which group is
really of any help. I started using the WUA [windows update agent] COM
API from C#. I created an interop assembly and my code compiles fine and
the most parts are running as expected.

I first create a UpdateSession object and look for updates, which are
downloaded. Then I create an UpdateInstaller, but this fails:

UpdateInstaller installer = (UpdateInstaller)
this.session.CreateUpdateInstaller(); //CRASH

I might have a wrong variable type here really. If I use VS's object
browser, I feel, I do not understand, why there are so many different
interfaces, like IUpdateInstaller, IUpdateInstaller2 etc.
I tried also:

IUpdateInstaller2 installer = (IUpdateInstaller2)
this.session.CreateUpdateInstaller(); //CRASH

May be, someone can help?

Thanks so far and
best regards,

I append a repro here [hopefully, this is readable]


Name: DemoComError.cs
Compile: csc /nologo /debug:full /t:exe /out:DemoComError.exe
/r:Interop.WUAApiLib.dll /r:log4net.dll DemoComError.cs
TLBIMP: TLBIMP /out:Interop.WUAApiLib.dll /namespace:Interop.WUALib
TlbImp warning: At least one of the arguments for
'UpdateInstaller.get_ParentHwnd' can not be marshaled by the runtime
marshaler. Such arguments will therefore be passed as a pointer and
may require unsafe code to manipulate.
Unhandled Exception: System.Runtime.InteropServices.COMException
(0x80020008): Bad variable type.
at Interop.WUALib.IUpdateSession2.CreateUpdateInstall er()
at AdminTools.WindowsUpdateInfo.InstallUpdates() in
d:\Develop\Dev\Experimente\WSUS\Net\WUAWrapper\Dem oComError.cs:line 87
using System;
using System.Runtime.InteropServices;
using Interop.WUALib;
namespace AdminTools

public class WUAApp
public static void Main(string[] args)
if(args.Length != 0)
WindowsUpdateInfo wui = new WindowsUpdateInfo(args[0]);
int count = wui.DetectUpdates(); //condition...
if(count != 0) wui.InstallUpdates();
Console.WriteLine("Args!!! [p1=computer]");

public class WindowsUpdateInfo
private string computerName;
private UpdateSession session;
private UpdateCollection updates;

public WindowsUpdateInfo(string computerName)
this.computerName = computerName;

Type type = Type.GetTypeFromProgID("Microsoft.Update.Session",
computerName, true);
this.session = (UpdateSession) Activator.CreateInstance(type);
catch(COMException ce)
Console.WriteLine("COMException;Exception:{0},Code :{1}", ce.Message,

public int DetectUpdates()
IUpdate u;

IUpdateSearcher us = session.CreateUpdateSearcher();
ISearchResult sr = us.Search("IsInstalled=0 and Type='Software'");
this.updates = sr.Updates;
for(int i = 0; i < this.updates.Count; i++)
u = this.updates[i]; //do something with update;show.
Console.WriteLine("Updates:{0}", this.updates.Count);

return this.updates.Count;

public void InstallUpdates()
UpdateCollection updates = new UpdateCollection();
for(int i = 0; i < this.updates.Count; i++)

Console.WriteLine("Added {0} updates to install.", updates.Count);

UpdateInstaller installer = (UpdateInstaller)
this.session.CreateUpdateInstaller(); //(87)CRASH
installer.Updates = updates;
IInstallationResult installationResult = installer.Install();

for(int i = 0; i < updates.Count; i++)
Console.WriteLine("Installed:{0},Result:{1}.", updates[i].Title,



Oct 29 '06 #1
1 5482
Worked part of my code for using WUA (C#), may be help you:

UpdateSessionClass updateSession = new UpdateSessionClass();
UpdateServiceManagerClass updateServiceManager = new
IUpdateServiceManager updateServiceManager =
IUpdateService updateService =
updateServiceManager.AddScanPackageService("Offlin e Sync Service",
"WSUSSCAN.cab", 0);
IUpdateSearcher updateSearcher = updateSession.CreateUpdateSearcher();
updateSearcher.ServerSelection = ServerSelection.ssOthers
updateSearcher.ServiceID = updateService.ServiceID;
ISearchResult searchResult = updateSearcher.Search("Type='Software'");
Aug 29 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

12 posts views Thread by Calum Grant | last post: by
4 posts views Thread by GVK | last post: by
1 post views Thread by ERamirez | last post: by
9 posts views Thread by Jim | last post: by
5 posts views Thread by Aussie Rules | last post: by
1 post views Thread by XIAOLAOHU | last post: by
reply views Thread by leo001 | last post: by
reply views Thread by MichaelMortimer | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.