gpt4 book ai didi

struct - 如何从 Windows API 访问结构中联合中的变量?

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:45 24 4
gpt4 key购买 nike

我得到了 input.ki 未定义(类型 C.INPUT 没有字段或方法 ki)

我尝试使用“union_”前缀,但没有成功。

有什么想法吗?

package main

// #include <windows.h>
// #include <winuser.h>
import "C"

// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
// typedef struct tagINPUT {
// DWORD type;
// union {
// MOUSEINPUT mi;
// KEYBDINPUT ki;
// HARDWAREINPUT hi;
// };
// } INPUT, *PINPUT;

func main() {
var input C.INPUT
var keybdinput C.KEYBDINPUT
input._type = 1 // ok!
// input.ki = keybdinput // input.ki undefined (type C.INPUT has no field or method ki)
// input.union_ki = keybdinput // input.union_ki undefined (type C.INPUT has no field or method union_ki)
}

最佳答案

因为联合会破坏类型安全,所以在 Go 中访问它们的唯一方法是使用 unsafe 包。我想你可以这样做:

*(*C.KEYBDINPUT)(unsafe.Pointer(uintptr(unsafe.Pointer(&input)) + unsafe.Sizeof(C.DWORD))) = keybdinput

如果我需要大量处理这些类型,我会声明包装器类型以使其更容易:

type tagKbdInput struct {
typ uint32
ki C.KEYBDINPUT
}

type tagMouseInput struct {
typ uint32
mi C.MOUSEINPUT
}

type tagHardwareInput struct {
typ uint32
hi C.HARDWAREINPUT
}

然后我可以通过 unsafe.Pointer(没有指针算法)使用更简单的转换来访问它们:

(*tagKbdInput)(unsafe.Pointer(&input)).ki = keybdinput

关于struct - 如何从 Windows API 访问结构中联合中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18707066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com