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


    再谈 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

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

       [StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)]
          internal struct XYZ
       {
    	  public int X;
    	  public double Y;
    	  public bool Z;
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    关系数据库的原子性
    《MongoDB入门教程》第04篇 MongoDB客户端
    【事务代码】MF60-拉料清单
    .net MVC下鉴权认证(三)
    网络安全等级保护相关标准及发展
    java计算机毕业设计古玩玉器交易系统源码+mysql数据库+系统+lw文档+部署
    el-form内容重置(解决点击保存关闭后再点击新增会有编辑携带的数据的问题)
    HTTP 协商缓存 Last-Modified,If-Modified-Since
    Halcon转OpenCV实例--保险丝颜色识别(附源码)
    Vue3类与样式绑定
  • 原文地址:https://blog.csdn.net/zyyujq/article/details/126400139