我正在使用Go语言对一些WinApi进行系统调用并获取结果。我能轻松地将C代码中的简单结构映射过来,但是如何处理下面这样的C结构呢?
如果在Go语言中定义了所有可能的类型
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语言中访问它。但是,在dwLinkChoice
之后的第一个字段(如上面的代码中的Moniker
)总是已填充,而其他两个字段总是为空。我知道这在C语言中是预期行为,因为你一次只能有一个联合字段。考虑到这一点,我是否应该忽略整个联合结构,在我的Go结构体中使用某种占位符?
type SPC_LINK struct {
dwLinkChoice DWORD
dwLink uintptr // a placeholder, will hold any possible value
}
我将占位符的类型设置为uintptr,但是如果原始的C结构在联合块中有其他非指针类型怎么办?我真的不确定如何处理C联合体,并寻求任何建议。
{size of the union}
将会是联合类型中最长的一个。 - vitr