如何确定要创建的 OLE 对象的名称,以便通过 WMI 检索 KB?

问题描述 投票:0回答:1

我正在尝试重写一个 C++ 程序,用于在 Go 中检索 Windows 计算机上所有已安装和取代的 KB。

C++ 程序通过从两个不同源查询 KB 来检索这些 KB:

  1. WMI,使用查询
    SELECT * FROM Win32_QuickFixEngineering
  2. 更新历史记录,使用
    IUpdateSearcher::GetTotalHistoryCount
    IUpdateSearcher::QueryHistory

我正在寻求帮助将 #1 翻译成 Go。

我认为我可以使用的最好的库是 go-ole。作为使用该库的示例,我查看了 github.com/ceshihao/windowsupdate 的源代码。我发现这个库有以下内容,以便创建一个用于查询更新历史记录的对象(source):

unknown, err := oleutil.CreateObject("Microsoft.Update.Session")

我相信这大致相当于我正在重写的 C++ 程序的这一部分(这是与本文开头列表中的第 2 项相对应的部分):

result = updateSession.CoCreateInstance(CLSID_UpdateSession, nullptr, CLSCTX_INPROC_SERVER);

但是,我不知道如何从 C++ 程序的不同部分翻译这一行(这是与本文开头列表中的第 1 项相对应的部分):

CComPtr<IWbemLocator> pLoc;

// <...>

// Obtain the initial locator to Windows Management
// on a particular host computer.
hres = pLoc.CoCreateInstance(CLSID_WbemLocator, nullptr, CLSCTX_INPROC_SERVER);

我认为等效的 Go 会是这样的:

unknown, err := oleutil.CreateObject("<mystery string>")

我尝试使用 Visual Studio 的“转到定义”功能查看

CLSID_WbemLocator
的定义,但它只是声明为

EXTERN_C const CLSID CLSID_WbemLocator;

这不是很有帮助。

我的问题是这样的:我如何确定应该使用什么作为

"<mystery string>"
来创建一个与 C++ 代码使用
CLSID_WbemLocator
创建的对象等效的对象?

c++ windows go winapi ole
1个回答
0
投票

您是否尝试过搜索已有的解决方案?

在 Google 上首次点击“WUApiLib in go”:

https://github.com/ceshihao/windowsupdate

© www.soinside.com 2019 - 2024. All rights reserved.