首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IUpdateInstaller4::Commit未找到

IUpdateInstaller4::Commit未找到
EN

Stack Overflow用户
提问于 2016-11-09 18:13:36
回答 1查看 414关注 0票数 2

我正在尝试使用新的WUAPI IUpdateInstaller4 for Windows 10的方法。

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

但我所有的尝试都失败了:

创建动态对象失败,“无定义异常”。示例:

代码语言:javascript
复制
dynamic installAgent = Activator.CreateInstance(Type.GetTypeFromProgID("Microsoft.Update.Installer"));
installAgent.Commit(IntPtr.Zero);

创建新类型库时不包含接口。

代码语言:javascript
复制
tlbimp.exe wuapi.dll /out=c:\_sandbox\WUApiInterop.dll 

任何帮助或暗示都会很好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-12 11:50:50

我复制。您肯定无法在Win10 1607版上实现这一点,嵌入在wuapi.dll中的类型库缺少IUpdateInstaller3和IUpdateInstaller4接口。当您从Developer提示符运行Oleview c:\windows\system32\wuapi.dll时,您可以自己看到一些东西。

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

不是唯一的问题,MSDN缺少IUpdateInstaller3的定义。这使得很难猜测如何正确声明C#中缺少的接口。您可以猜到IUpdateInstaller3刚刚又添加了一个方法。

不过,它确实实现了接口。使用MSDN文章中记录的IID查询它在我的机器上工作得很好:

代码语言:javascript
复制
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 2016,目前在技术预览。如果您要通过自己声明接口来解决这个问题,那么请记住,您的IUpdateInstaller4声明必须包括以前接口版本的所有方法,接口继承不能工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40513440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档