func (i *Installer) HResult() (string, error) {
	hr, err := oleutil.GetProperty(i.IInstallationResult, "HResult")
	if err != nil {
		return "", fmt.Errorf("error getting HResult property: %v", err)
	}
	return fmt.Sprintf("%s", errors.UpdateError(hr.Val)), nil
}
HResult gets the HRESULT of the exception, if any, that is raised during the installation.
package install
import (
	goerr "errors"
	"fmt"
	"github.com/google/cabbie/errors"
	"github.com/google/cabbie/session"
	"github.com/google/cabbie/updatecollection"
	"github.com/go-ole/go-ole"
	"github.com/go-ole/go-ole/oleutil"
)
var (
	ErrBusy = goerr.New("an installation or uninstallation is already in progress")
)
type Installer struct {
	IUpdateInstaller    *ole.IDispatch
	IInstallationResult *ole.IDispatch
}
func NewInstaller(us *session.UpdateSession, uc *updatecollection.Collection) (*Installer, error) {
	udi, err := us.CreateInterface(session.Installer)
	if err != nil {
		return nil, err
	}
	if _, err = oleutil.PutProperty(udi, "Updates", uc.IUpdateCollection); err != nil {
		return nil, fmt.Errorf("failed to register updates for install: \n %v", err)
	}
	return &Installer{IUpdateInstaller: udi}, nil
}
func (i *Installer) Install() error {
	b, _ := i.IsBusy()
	if b {
		return ErrBusy
	}
	r, err := oleutil.CallMethod(i.IUpdateInstaller, "Install")
	i.IInstallationResult = r.ToIDispatch()
	if err != nil {
		return fmt.Errorf("install error: [%s] [%v]", errors.UpdateError(r.Val), err)
	}
	return nil
}
func (i *Installer) Uninstall() error {
	r, err := oleutil.CallMethod(i.IUpdateInstaller, "Uninstall")
	i.IInstallationResult = r.ToIDispatch()
	if err != nil {
		return fmt.Errorf("uninstall error: [%s] [%v]", errors.UpdateError(r.Val), err)
	}
	return nil
}
func (i *Installer) IsBusy() (bool, error) {
	p, err := oleutil.GetProperty(i.IUpdateInstaller, "IsBusy")
	if err != nil {
		return false, err
	}
	return p.Value().(bool), nil
}