从C
++刚刚起步的新世纪开始,您就来到了COM的美好世界,即C语言中的面向对象编程。
在github上,mattn 在Go中集成了一个小包装,我曾经使用它包装了一个快速的示例程序。“
这个存储库是为实验而创建的,应该被认为是不稳定的。 ”灌输了各种各样的信心。
我省去了很多错误检查。当我说时,请相信我,您将想要重新添加。
package mainimport ( "github.com/mattn/go-ole" "github.com/mattn/go-ole/oleutil")func main() { // init COM, oh yeah ole.CoInitialize(0) defer ole.CoUninitialize() unknown, _ := oleutil.CreateObject("Wbemscripting.SWbemLocator") defer unknown.Release() wmi, _ := unknown.QueryInterface(ole.IID_IDispatch) defer wmi.Release() // service is a SWbemServices serviceRaw, _ := oleutil.CallMethod(wmi, "ConnectServer") service := serviceRaw.ToIDispatch() defer service.Release() // result is a SWBemObjectSet resultRaw, _ := oleutil.CallMethod(service, "ExecQuery", "SELECt * FROM Win32_Process") result := resultRaw.ToIDispatch() defer result.Release() countVar, _ := oleutil.GetProperty(result, "Count") count := int(countVar.Val) for i :=0; i < count; i++ { // item is a SWbemObject, but really a Win32_Process itemRaw, _ := oleutil.CallMethod(result, "ItemIndex", i) item := itemRaw.ToIDispatch() defer item.Release() asString, _ := oleutil.GetProperty(item, "Name") println(asString.ToString()) }}真正的问题是对ExecQuery的调用,我碰巧从可用的类中获取Win32_Process,因为它易于理解和打印。
在我的机器上,将打印:
System Idle ProcessSystemsmss.execsrss.exewininit.exeservices.exelsass.exesvchost.exesvchost.exeatiesrxx.exesvchost.exesvchost.exesvchost.exesvchost.exesvchost.exespoolsv.exesvchost.exeAppleOSSMgr.exeAppleTimeSrv.exe... and so ongo.exemain.exe
我不是在提升运行状态或未禁用UAC的情况下运行,但某些WMI提供程序将需要特权用户。
我也不是100%不会漏掉一点,您需要深入研究一下。COM对象是按引用计数的,因此
defer应该很合适(前提是该方法长期运行不会疯狂),但是go-
ole可能有一些我没注意到的魔术。



