杨__羊羊
在@alex 的建议之后,我得到了以下示例代码。看起来我们创建了一个正确大小的字节切片,然后使用 unsafe 类转换为我们的结构类型。 _, _, _ = 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.") }