• 再谈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
  • 相关阅读:
    wps-文档-js宏-批量修改表格格式
    数据库的新选择 Amazon Aurora
    会议剪影 | 思腾合力受邀出席第四届长三角文博会并作主题演讲
    VirtualLab专题实验教程-1.超表面纳米柱及其相位分析
    KafkaBroker的重要参数
    SpringBoot(一、快速入门)
    ant target的if和unless属性:控制target是否执行
    Spring源码之invokeBeanFactoryPostProcessors扫描、BeanDefinition生成
    PX4模块设计之十四:Event设计
    CSS之垂直水平居中的背后
  • 原文地址:https://blog.csdn.net/zyyujq/article/details/126400139