CSharp Tips:调用Win32 API如何处理指针类型的参数(补)

2年多前整理了一下调用Win32 API过程中指针类型的参数如何处理,发觉遗漏的重要的一点,就是怎样处理UNION

C/C++UNION是这样定义:

“联合”是一种特殊的类,也是一种构造类型的数据结构。 在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。

首先UNION和结构(STRUCT)一样是值类型,两者最大的不同在于内部成员所占用的空间上。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。所以在使用上和结构是一致的,关键在于定义不同。C#中没有UNION关键字,我们就用struct,外加一点技巧来实现。例如:

这里“[StructLayout(LayoutKind.Explicit)]”的修饰很重要,就是表明结构内的成员按照设定的位置在内存中排列。上面的例子中mikihi三个成员都是结构体内便宜的第四个字节开始的,也就暗合了UNION内的成员共享同一段内存(首地址相同)。UNION能够处理了,API的申明就很简单了,和STRUCT完全一致,例如:

 

就这么简单,搞定。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值