Structure PARAMDESCEX

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Structure PARAMDESCEX

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Structure PARAMDESCEX

Beitrag 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.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Structure PARAMDESCEX

Beitrag 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;
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Structure PARAMDESCEX

Beitrag 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ß.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Structure PARAMDESCEX

Beitrag 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();
}
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Structure PARAMDESCEX

Beitrag von NicTheQuick »

Das ist ja gar kein reines C++ bzw. C. Das ist ja .NET.

Da hat ULONG nämlich 8 Byte: C# Datentypen
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Structure PARAMDESCEX

Beitrag 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.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Structure PARAMDESCEX

Beitrag 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:
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Structure PARAMDESCEX

Beitrag 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;
}
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Structure PARAMDESCEX

Beitrag 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;
}
Antworten