我正在尝试重写一个 C++ 程序,用于在 Go 中检索 Windows 计算机上所有已安装和取代的 KB。
C++ 程序通过从两个不同源查询 KB 来检索这些 KB:
SELECT * FROM Win32_QuickFixEngineering
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
创建的对象等效的对象?