再谈VC++动态链接库中的结构成员与VB或C#调用

12 篇文章 0 订阅
3 篇文章 0 订阅

再谈 VC++ 动态链接库中的结构成员与 VB 或 C# 调用


1 、VC++ 动态链接库可以编译为 X64 和 X86
2 、VC++ 动态链接库又可以选择编译为 结构成员 8 字节 和 4 字节对齐的库文件
(其它字节 1、2、16 与系统不匹配,可以暂时不讨论)

3、32 位系统默认结构成员 4 字节对齐
4、64 位系统默认结构成员 8 字节对齐
5、VS2017 默认 8 字节对齐,无论 VB.NET、C#、VC++ 编译为 X64 还是 X86
6、VB6_32位版本编译的程序,默认为定义结构成员对齐为 4 字节
7、VB.NET、C#、VC++ 都可以自定义结构成员对齐


因此,编译程序必须严格按编程规则,这样就不会产生程序混乱,否则参数传递容易出错,8 字节 对齐参数传递给 4 字节 对齐参数,必然出错:

1、VC++动态链接库编译为 X64 库文件,结构成员应该选择 8 字节 对齐
2、VC++动态链接库编译为 X86 库文件,结构成员应该选择 4 字节 对齐
3、VB.NET 或 C# 编译为 X64 程序,必须定义结构成员对齐为 8 字节,调用对应 8 字节 对齐的 X64 库文件
4、VB.NET 或 C# 编译为 X86 程序,必须定义结构成员对齐为 4 字节,调用对应 4 字节 对齐的 X32 库文件


自编程序 调用 自编 VC++ 动态链接库, 最容易出现的程序错误就是字节对齐不相应:

1、VB.NET 默认 8 字节对齐结构体,却编译为 32 位程序,去调用 4 字节对齐的动态链接库。
2、VB.NET 默认 8 字节对齐结构体,编译为 32 位程序,动态链接库也默认 8 字节对齐结构体,编译为 32 位 DLL,相互可以正确调用,别的程序如EXCEL 32 位调用该 8 字节对齐结构体的 32 位 DLL,数据就容易无法获取正确数据。


VB.NET定义结构成员 4 字节对齐,其下就是结构成员定义:

   <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)>
   Structure XYZ
      Dim X As Integer
      Dim Y As Double
      Dim Z As Boolean
   End Structure

VB.NET定义结构成员 8 字节对齐:

   <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)>
      Structure XYZ
      Dim X As Integer
      Dim Y As Double
      Dim Z As Boolean
   End Structure

C# 定义结构成员 4 字节对齐:

   [StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)]
      internal struct XYZ
   {
	  public int X;
	  public double Y;
	  public bool Z;
   }

C# 定义结构成员 8 字节对齐:

   [StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)]
      internal struct XYZ
   {
	  public int X;
	  public double Y;
	  public bool Z;
   }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中游鱼

获取完整源代码,提高工作效率

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值