将具有联合字段的 C 结构映射到 Go 结构

2024-05-04

我从 Go 中的某些 WinApi 的系统调用中获取结果。我可以轻松地从 C 代码映射简单的结构,但是如何处理如下所示的 C 结构?

typedef struct SPC_LINK_
{
    DWORD dwLinkChoice;
#               define          SPC_URL_LINK_CHOICE         1
#               define          SPC_MONIKER_LINK_CHOICE     2
#               define          SPC_FILE_LINK_CHOICE        3

    union
    {
        LPWSTR                  pwszUrl;
        SPC_SERIALIZED_OBJECT   Moniker;
        LPWSTR                  pwszFile;
    };

} SPC_LINK, *PSPC_LINK;

如果Go中定义了所有可能的类型

type SPC_LINK struct {
    dwLinkChoice  DWORD
    Moniker       SPC_SERIALIZED_OBJECT
    pwszFile      LPWSTR
    pwszUrl       LPWSTR
}

在系统调用之后unsafe.Pointer将此 Go 结构体作为参数,我已将其存储在内存中,并且可以像往常一样在 Go 中访问它,但只能访问之后的第一个字段dwLinkChoice (Moniker在上面的代码中)始终被填充,其他两个始终为空。我知道这是 C 中的预期行为,因为一次只能有一个联合字段。考虑到这一点,我是否应该忽略整个联合结构并在 Go 结构中添加某种占位符?

type SPC_LINK struct {
    dwLinkChoice  DWORD
    dwLink        uintptr // a placeholder, will hold any possible value
}

我将占位符的类型设置为 uintptr,但是如果原始 C 结构在 union 块中有一些其他非指针类型怎么办?我真的不知道如何处理 C 工会并寻找任何建议。


如中所述CGO文档 https://golang.org/cmd/cgo/,

由于 Go 在一般情况下不支持 C 的联合类型,因此 C 的联合类型表示为具有相同长度的 Go 字节数组。

也许你应该尝试这个

type SPC_LINK struct {
    dwLinkChoice  DWORD
    dwLink        [{size of the union}]byte
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将具有联合字段的 C 结构映射到 Go 结构 的相关文章

随机推荐