IUpdateInstaller4::未找到提交

本文关键字:提交 IUpdateInstaller4 | 更新日期: 2023-09-27 18:17:04

我正在尝试使用Windows 10的新WUAPI IUpdateInstaller4方法。我发现它在这里:

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

但我所有的努力都失败了:

创建动态对象失败,提示"no definition exception"。例子:

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

创建一个新的类型库不包含接口。

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

任何帮助或提示将是伟大的

IUpdateInstaller4::未找到提交

你当然不能在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声明必须包含以前接口版本的所有方法,接口继承不能工作。