Seite 1 von 2

Structure PARAMDESCEX

Verfasst: 15.03.2013 22:20
von Josh
Ich bin gerade dabei einige meiner Strukturen auf das neue Align #PB_Structure_AlignC umzustellen. Wie ich die Strukturen ursprünglich erstellt habe, habe ich diese aufgefüllt und mit einem C++ Programm das SizeOf und Offset überprüft. Bei der Struktur PARAMDESCEX hatte ich damals schon Probleme, weil mir mein C++ Programm was anderes gesagt hat als es logisch war. Leider kann ich dieses C++ Programm nicht mehr finden und ich selbst kenne mich damit nicht aus.

Code: Alles auswählen

typedef struct tagPARAMDESCEX {
  ULONG      cBytes;
  VARIANTARG varDefaultValue;
} PARAMDESCEX, *LPPARAMDESCEX;
Die Struktur ist in OaIdl.h beschrieben. Bei Microsoft findet ihr die Beschreibung hier.

Ich bin damals nach Überprüfung mit meinem C++ Programm auf folgende Pb Struktur gekommen:

Code: Alles auswählen

  Structure PARAMDESCEX
    cBytes.l
    padding.b[4] ; warum bei x32 ???
    DefaultValue.VARIANT
  EndStructure
Bei x64 ist ja noch alles logisch, aber warum auch bei x32 ist mir unklar und auch unlogisch. Wäre nett, wenn einer der C++ Gurus das nochmals checken könnte.

Danke
Josh

Re: Structure PARAMDESCEX

Verfasst: 15.03.2013 23:35
von NicTheQuick
ULONG von Microsoft ist vergleichbar mit dem Quad aus Purebasic. Es hat immer 64 Bit, egal welche Architektur darunter liegt. Allerdings gibt es bei PB keine unsigned Quads, aber so lange cBytes nicht größer wird als 2^63 - 1 geht das ja. Zusammenfassung sollte es also "cBytes.q" heißen.

Re: Structure PARAMDESCEX

Verfasst: 16.03.2013 00:43
von edel
Long ist unter Windows 32 bit gross.

LONG:
A 32-bit signed integer. The range is –2147483648 through 2147483647 decimal.
This type is declared in WinNT.h as follows:
typedef long LONG;
ULONG:
An unsigned LONG. The range is 0 through 4294967295 decimal.
This type is declared in WinDef.h as follows:
typedef unsigned long ULONG;

Re: Structure PARAMDESCEX

Verfasst: 16.03.2013 01:04
von NicTheQuick
Oha, okay. Ich hab nochmal geschaut. Ich bin bei C# gelandet. Dort ist ULONG genau wie bei Visual Basic nämlich 8 Bytes groß.

Re: Structure PARAMDESCEX

Verfasst: 16.03.2013 02:26
von Josh
Wobei ich wieder soweit wie am Anfang bin. Schade, wäre eine schöne Erklärung für mein Problem gewesen :lol:

Ich habe mir für mein VC 2010 Express folgenden Code gebastelt, wobei ich sagen muss, dass ich keine Ahnung von C++ habe und der Code nicht richtig sein muss. Auf jedem Fall bekomme ich mit diesem Code für die Struktur PARAMDESCEX unter x86 ein SizeOf von 24, obwohl es nach meinem Verständnis und dem von PB Align 20 sein müsste.

Code: Alles auswählen

#include "stdafx.h"
#include <stdio.h>
#include <objbase.h>

using namespace System;

int main(array<System::String ^> ^args)
{
  Console::WriteLine("The size is {0}.", sizeof(tagPARAMDESCEX));
  Console::ReadKey();
}

Re: Structure PARAMDESCEX

Verfasst: 16.03.2013 03:30
von NicTheQuick
Das ist ja gar kein reines C++ bzw. C. Das ist ja .NET.

Da hat ULONG nämlich 8 Byte: C# Datentypen

Re: Structure PARAMDESCEX

Verfasst: 16.03.2013 03:47
von Josh
NicTheQuick hat geschrieben:Da hat ULONG nämlich 8 Byte: C# Datentypen
Mit C# kann es nichts zu tun haben. Visual C++ 2010 Express
Wenn ich bei SizeOf anstatt tagPARAMDESCEX einfach long eingebe, weiß SizeOf auch, dass die Größe 4 und nicht 8 ist.

Re: Structure PARAMDESCEX

Verfasst: 17.03.2013 14:46
von Josh
Kein C Programmierer da, der ein paar Codezeilen schreiben kann und mir sagen, was SizeOf von PARAMDESCEX für x86 (wenn möglich auch für x64) bei Ihm ergibt? :cry:

Re: Structure PARAMDESCEX

Verfasst: 17.03.2013 16:28
von edel
24 unter 32bit
32 unter 64bit

Code: Alles auswählen

#include <windows.h>
#include <stdio.h>

int main(void)
{
	printf("sizeof PARAMDESCEX : %i byte\n", sizeof(PARAMDESCEX));
	return 0;
}

Re: Structure PARAMDESCEX

Verfasst: 17.03.2013 17:55
von Josh
Danke Edel, jetzt bekomme ich folgendes Ergebnis:

Code: Alles auswählen

sizeof   ULONG       : 4 byte
sizeof   VARIANTARG  : 16 byte
sizeof   PARAMDESCEX : 24 byte

offestof VARIANTARG  : 8 byte
Das bestätigt eigentlich was ich oben geschrieben habe. Folgende Möglichkeiten ergeben sich für mich:
  • Meine bisherigen Vorstellungen von Mathematik sind falsch und 4 ist wirklich 8
  • Bei Align gibt es ein paar tiefere Geheimnisse, die in der neuen Funktion Align #PB_Structure_AlignC auch nicht berücksichtigt sind
  • Andere Möglichkeiten die über mein momentanes Vorstellungsvermögen hinausgehen
Hat jemand eine Erklärung dafür? Es geht nur um die 32bit Version! Mein Code schaut wie folgt aus:

Code: Alles auswählen

#include <stdafx.h>
#include <windows.h>
#include <stdio.h>
#include <stddef.h>

int main(void)
{
   printf("sizeof   ULONG       : %i byte\n", sizeof(ULONG));
   printf("sizeof   VARIANTARG  : %i byte\n", sizeof(VARIANTARG));
   printf("sizeof   PARAMDESCEX : %i byte\n", sizeof(PARAMDESCEX));
   printf("\n");
   printf("offestof VARIANTARG  : %i byte\n", offsetof(PARAMDESCEX, varDefaultValue));
   
   system("PAUSE>nul");

   return 0;
}