C# Com互操作结构定义与内存布局不匹配
COM头(vds.h)中定义了一个结构: 我已经注释了一些字段的类型。根据此标头定义,结构似乎有72个字节大。但是,当我在C#中封送它(我得到一个IntPtr到这些结构的数组中)并查看IntPtr所指示的内存时,我看到:C# Com互操作结构定义与内存布局不匹配,c#,c++,com,interop,C#,C++,Com,Interop,COM头(vds.h)中定义了一个结构: 我已经注释了一些字段的类型。根据此标头定义,结构似乎有72个字节大。但是,当我在C#中封送它(我得到一个IntPtr到这些结构的数组中)并查看IntPtr所指示的内存时,我看到: 0x01717A50 a8 c5 af 28 37 e1 0d 43 -> diskId 0x01717A58 b0 87 e2 ef 94 5f 9f 27 -> diskId 0x01717A60 02 00 00 00 00 00 00 00 -&
0x01717A50 a8 c5 af 28 37 e1 0d 43 -> diskId
0x01717A58 b0 87 e2 ef 94 5f 9f 27 -> diskId
0x01717A60 02 00 00 00 00 00 00 00 -> first 4 bytes are extent type, second 4?
0x01717A68 00 00 70 23 00 00 00 00 -> offset
0x01717A70 00 00 50 4d 74 00 00 00 -> size
0x01717A78 38 3c 22 26 e9 de df 44 -> volumeId
0x01717A80 81 f3 ba ee af e2 ad 2b -> volumeId
0x01717A88 48 98 78 bb 7f dd bc 41 -> plexId
0x01717A90 94 17 db d2 86 01 54 ce -> plexId
0x01717A98 00 00 00 00 00 00 00 00 -> first 4 bytes are membderIdx, second 4?
如您所见,有2个4字节的区域未被解释。C++枚举声明为“代码> TyPulfEnUM VDSDISKEX ExtType类型{所以我不认为它是8个字节。和memberIdx一样,它被声明为一个ULONG,所以它是4个字节。这个填充是在哪里定义的,或者每个字段的偏移量是在哪里定义的?如果我必须查看内存中的每个对象,并找出字段之间的真正边界,那么使用这个com程序集中的对象几乎是不可能的这是一个结构成员对齐的例子。具体来说,这个结构是用8字节的对齐方式编译的,这是VisualC++的默认值。注意每个成员都是从8字节边界开始的。如果连续的成员小于8字节(例如,两个连续的<代码> ULUN < /代码> s),您不会在第一个
ULONG
上看到额外的填充(因为使用对齐值>=4时,4字节成员可以在4字节边界上对齐)。但是,由于有一个ULONG
后跟一个ULONGLONG
,ULONG
成员被填充,因此下面的ULONGLONG
成员在8字节边界上对齐(因为8字节成员不能在4字节边界上对齐)
0x01717A50 a8 c5 af 28 37 e1 0d 43 -> diskId
0x01717A58 b0 87 e2 ef 94 5f 9f 27 -> diskId
0x01717A60 02 00 00 00 00 00 00 00 -> first 4 bytes are extent type, second 4?
0x01717A68 00 00 70 23 00 00 00 00 -> offset
0x01717A70 00 00 50 4d 74 00 00 00 -> size
0x01717A78 38 3c 22 26 e9 de df 44 -> volumeId
0x01717A80 81 f3 ba ee af e2 ad 2b -> volumeId
0x01717A88 48 98 78 bb 7f dd bc 41 -> plexId
0x01717A90 94 17 db d2 86 01 54 ce -> plexId
0x01717A98 00 00 00 00 00 00 00 00 -> first 4 bytes are membderIdx, second 4?