IUpdateInstaller4 ::找不到提交

时间:2016-11-09 18:13:36

标签: c# wuapi

我尝试使用适用于Windows 10的新WUAPI IUpdateInstaller4方法。我在此处找到了它:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt694207(v=vs.85).aspx

但是我所尝试的一切都失败了:

创建动态对象失败,没有#34;没有定义异常"。例如:

dynamic installAgent = Activator.CreateInstance(Type.GetTypeFromProgID("Microsoft.Update.Installer"));
installAgent.Commit(IntPtr.Zero);

创建新类型的lib不包含接口。

tlbimp.exe wuapi.dll /out=c:\_sandbox\WUApiInterop.dll 

任何帮助或提示都会很棒。

1 个答案:

答案 0 :(得分:3)

我责备。你肯定无法在Win10版本1607上实现这一点,wuapi.dll中嵌入的类型库缺少IUpdateInstaller3和IUpdateInstaller4接口。从开发人员命令提示符运行Oleview c:\windows\system32\wuapi.dll时,您可以看到自己的东西。

不是唯一的问题,请注意MSDN文章中引用的Wuapi_p.h头文件。它也缺少我在我的机器上安装的Win10 SDK版本(版本10.0.10586.0)。有更新的版本(14393)。请注意,如果它包含它,我已经避免了它,因为我在上一版本中遇到了可怕的安装问题。

不是唯一的问题,MSDN缺少IUpdateInstaller3的定义。这使得很难猜测如何正确地声明C#中缺少的接口。你可以试着猜测IUpdateInstaller3只增加了一个方法。

然而确实实现了该接口。使用MSDN文章中记录的IID查询它可以在我的机器上正常工作:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

class Program {
    static void Main(string[] args) {
        var obj = new WUApiLib.UpdateInstaller();
        var punk = Marshal.GetIUnknownForObject(obj);
        var iid4 = new Guid("EF8208EA-2304-492D-9109-23813B0958E1");
        IntPtr itf4;
        var hr = Marshal.QueryInterface(punk, ref iid4, out itf4);
        Debug.Assert(hr == 0 && itf4 != IntPtr.Zero);  // fine
    }
}

但这不会帮助您拨打电话,而不是没有接口定义。这些都是典型的敏捷"问题顺便说一下,这几天微软开展业务的方式是个常见问题。粗糙和翻滚是你太早做这件事,下一个版本可能会更好。这可能是Windows Server 2016的一些可能性,目前在技术预览版中。如果您打算通过自己声明接口来解决它,那么请记住,您的IUpdateInstaller4声明必须包含以前接口版本的所有方法,接口继承无法工作。