Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Com互操作结构定义与内存布局不匹配_C#_C++_Com_Interop - Fatal编程技术网

C# Com互操作结构定义与内存布局不匹配

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 -&

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  -> 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?