- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在编写一个与来自 Windows 服务的 Windows API 交互的应用。
在@chowey 的大量帮助之后 here ,我有点掌握了窍门,开始了一个基本库,我把它放在 GitHub 上 here .
我现在转到“服务”,要求列出一台机器上的所有 Windows 服务,启动、停止、重新启动它们。一旦您有一个服务句柄可以使用,启动/停止/重新启动看起来非常简单,但我正在努力获取已安装服务的列表。
EnumServicesStatusEx在 Advapi32.dll 中是我需要调用的函数,但它需要一个指向为 ENUM_SERVICE_STATUS_PROCESS 数组预分配内存的指针结构。
你可以用空指针调用函数,它会返回所需的内存分配大小,但我不相信有一种方法可以在 Go 中直接分配内存。
起初我以为我可以获得内存分配要求,使用不安全包将它除以结构的 SizeOf,创建一个包含该数量元素的 slice ,然后将指向第一个元素的指针传递给函数,但它表示内存需要包含字符串数据的空间,而这不会。
请问有人知道如何实现吗? :).
最佳答案
根据@alex 的建议,我得到了以下示例代码。
看起来我们创建了一个大小合适的 byte slice ,然后使用不安全类转换为我们的结构类型。
_, _, _ = svcEnumServicesStatusEx.Call(
uintptr(handle),
uintptr(uint32(SVC_SC_ENUM_PROCESS_INFO)),
uintptr(uint32(SVC_SERVICE_WIN32)),
uintptr(uint32(SVC_SERVICE_STATE_ALL)),
uintptr(0),
0,
uintptr(unsafe.Pointer(&bytesReq)),
uintptr(unsafe.Pointer(&numReturned)),
uintptr(unsafe.Pointer(&resumeHandle)),
uintptr(0),
)
if bytesReq > 0 {
var buf []byte = make([]byte, bytesReq)
ret, _, _ := svcEnumServicesStatusEx.Call(
uintptr(handle),
uintptr(uint32(SVC_SC_ENUM_PROCESS_INFO)),
uintptr(uint32(SVC_SERVICE_WIN32)),
uintptr(uint32(SVC_SERVICE_STATE_ALL)),
uintptr(unsafe.Pointer(&buf[0])),
uintptr(bytesReq),
uintptr(unsafe.Pointer(&bytesReq)),
uintptr(unsafe.Pointer(&numReturned)),
uintptr(unsafe.Pointer(&resumeHandle)),
uintptr(0),
)
if ret > 0 {
var sizeTest ENUM_SERVICE_STATUS_PROCESS
iter := uintptr(unsafe.Pointer(&buf[0]))
for i := uint32(0); i < numReturned; i++ {
var data *ENUM_SERVICE_STATUS_PROCESS = (*ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(iter))
fmt.Printf("Service Name: %s - Display Name: %s - %#v\r\n", syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(data.lpServiceName))[:]), syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(data.lpDisplayName))[:]), data.ServiceStatusProcess)
iter = uintptr(unsafe.Pointer(iter + unsafe.Sizeof(sizeTest)))
}
} else {
return nil, fmt.Errorf("Failed to get Service List even with allocated memory.")
}
} else {
return nil, fmt.Errorf("Unable to get size of required memory allocation.")
}
关于windows - Go中调用EnumServicesStatusEx,内存分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37250855/
我在我的代码中调用了 EnumServicesStatusEx() 两次,第一次应该失败并将正确的缓冲区大小放入 dwBuffNeeded 中,这样当我第二次调用它时缓冲区大小应该是正确的。但是,有时
我是一名优秀的程序员,十分优秀!