2017-07-28 3 views
-1

Ich habe mit Erfolg ein Strukturobjekt aus einem gültigen Zeiger mit der Funktion PtrToStructure (in VB.NET) extrahiert, aber das Ergebnis einiger Objektmitglieder sind nicht korrekt (im Vergleich mit dem C++ Beispiel):undefiniertes Verhalten mit StructLayout und FieldOffset

der Code:

StructLayout(LayoutKind.Explicit, pack:=1, CharSet:=CharSet.Ansi)> _ 
    Public Structure MyStruct 

     <FieldOffset(0)> _ 
     Dim Width As UInt32 ' 350 correct 
     <FieldOffset(4)> _ 
     Dim Height As UInt32 ' 466 correct 
     <FieldOffset(20)> _ 
     Dim Buffer As IntPtr ' variable but correct 
     <FieldOffset(24)> _ 
     Dim BufferPitch As Integer ' 1408 correct 
     <FieldOffset(16)> _ 
     Dim SurfaceType As Integer ' -2147483645 correct 
     <FieldOffset(unknow)> _ 
     Dim WindowWidth As UInt32 ' must be 356, tested from 0 to 230 
     <FieldOffset(unknow)> _ 
     Dim WindowHeight As UInt32 ' must be 495, tested from 0 to 100 
     <FieldOffset(15)> _ 
     Dim ScreenHeight As UInt32 ' 768 correct 
     <FieldOffset(36)> _ 
     Dim ScreenWidth As UInt32 ' 1366 correct 
     <FieldOffset(44)> _ 
     Dim ScreenDepth As UInt32 ' 32 correct 
End Structure 

ich nicht die genauen Werte für die Parameter FieldOffset von Windowwidth und Window finden. die Frage ist warum und wie man sie repariert?

struct myStruct 
{ 
    U32 Width; // U32 = 32-bit unsigned integer 
    U32 Height; 
    VOID_PTR Buffer; 
    S32 BufferPitch; // 32-bit signed integer 
    COPY_FLAGS SurfaceType; // integer 
    U32 WindowWidth; 
    U32 WindowHeight; 
    U32 ScreenWidth; 
    U32 ScreenHeight; 
    U32 ScreenDepth; 
} 
+0

Der Offset von 15 auf ScreenHeight ist fast sicher falsch; Offsets sollten in Vielfachen von 4 oder 8 sein. Die Offsets von 36 und 44 auf ScreenWidth und ScreenDepth sind verdächtig, weil die Lücken von 24 zu 36 und wieder von 36 zu 44 viel größer sind als die Daten davor. Es sollte wahrscheinlich etwas bei einem Offset von 8 und etwas bei einem Offset von 12 geben. – Craig

+0

der Offset von 15 gibt das korrekte Ergebnis (ich getestet und erneut mit anderen Zeigern, also mit anderen Strukturen getestet). Das gleiche Problem mit den anderen Mitgliedern, das Problem liegt bei den Mitgliedern WindowWidth und WindowHeight. –

+0

Wird die C++ - Struktur * genau * wie angegeben angezeigt? Sind Sie sicher, dass nichts anderes auf der C++ Seite das Strukturlayout beeinflussen würde? Compileroptionen, Pragmas? Der einzige Weg, den ich mir vorstellen kann, um einen Offset von 15 zu erhalten, ist, etwas zu haben, das eine Größe von einem Byte hat UND etwas zu haben, das C++ sagt, die Struktur nicht auszurichten. – Craig

Antwort

-1

Dieses Problem ist gelöst. Ändern Sie den Offset in 8 und 12 und ändern Sie den Zeigerparameter um einen anderen Wert.

Verwandte Themen