Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Large Integer? Welcher Typ in Delphi (https://www.delphipraxis.net/104508-large-integer-welcher-typ-delphi.html)

himitsu 7. Dez 2007 16:54

Re: Large Integer? Welcher Typ in Delphi
 
in Delphi gibt es den Record auch ... der heißt übrigens ganz einfach LARGE_INTEGER / _LARGE_INTEGER :zwinker:

Delphi-Quellcode:
type // aus Unit Windows
  PLargeInteger = ^TLargeInteger;
  _LARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: Longint);
    1: (
      QuadPart: LONGLONG);
  end;
  TLargeInteger = Int64;
  LARGE_INTEGER = _LARGE_INTEGER;

  ULARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: DWORD);
    1: (
      QuadPart: LONGLONG);
  end;
  PULargeInteger = ^TULargeInteger;
  TULargeInteger = ULARGE_INTEGER;

richard_boderich 7. Dez 2007 17:01

Re: Large Integer? Welcher Typ in Delphi
 
@Himitsu
is jetz nich dein Ernst oder? ;)
Hast du dir die demo mal angeschaut? Wenn ich einen Int64 nehme liefert mir die Funktion nur noch Schwachsinn zurück.
Ich bezweifle, das es mit einer so großen Recordstruktur anders sein wird. Aber ich teste das mal. Entweder ich hab
nen kapitale Bug drinn oder die MSDN ist dort falsch dokumentiert.

mfG Richard

himitsu 7. Dez 2007 17:11

Re: Large Integer? Welcher Typ in Delphi
 
ohh, da gibt's 'ne Demo :shock: (war nicht im Themen-Rückblick zu sehn -.-'')

ich schau mal rein :???:

richard_boderich 7. Dez 2007 17:16

Re: Large Integer? Welcher Typ in Delphi
 
@Himitsu
wenn ich Large_Integer nehme kracht es ->Kernel32.dll exeption
Wenn ich Plargeinteger nehm. funktioniert es, jedoch ist in der Strucktur kein Pointer ausgeschrieben.

Ich habe festgestellt, das wenn ich für den Parameter Time von TKBasicInformation einen Int64 nehm füllt windows anscheinend sie Struktur nicht mehr richtig. Tlasttimewrite sollte eigentlich auch 2 Dword beinhalten statt 2 word. jedoch kracht es dann wieder.
Entweder ich lese die Struktur falsch aus, oder es liegt am Typ des Feldes Time? Die Länge und der String werden ja richtig ausgelesen , das habe ich überprüft.

Richard

himitsu 7. Dez 2007 17:40

Re: Large Integer? Welcher Typ in Delphi
 
also dann ist es wohl ein Fehler im MSDN?

weil LARGE / LONGLONG = 64 Bit :stupid:

Plargeinteger = Pointer/Integer also wieder 32 Bit ... wird die API wohl doch nur 32 Bit haben wollen :gruebel:

und dieses _KEY_BASIC_INFORMATION hätte ich so Übersetzt
Delphi-Quellcode:
TKeyBasicInformation = packed record
  Time: TFileTime;
  TitleIndex: LongWord;
  NameLength: LongWord;
  Name: Array[0..0] of WideChar;
end;
stimmt sozusagen mit deinem überein.



mit KEY_INFORMATION_CLASS mußt du erstmal aufpassen ... entweder du sorgst dafür daß dieses Set 4 Byte groß ist (standardmäßig macht Delphi dieses nur 1 Byte klein)

oder du definierst es so:
Delphi-Quellcode:
type
  KEY_INFORMATION_CLASS = ULONG;

const
  KeyBasicInformation         = 0;
  KeyCachedInformation        = 1;
  KeyNameInformation          = 2;
  KeyNodeInformation          = 3;
  KeyFullInformation          = 4;
  KeyVirtualizationInformation = 5;
ich mach's gern auch so ... da sieht man den Zusammenhang
Delphi-Quellcode:
type KEY_INFORMATION_CLASS = ULONG;
const KeyBasicInformation         = KEY_INFORMATION_CLASS(0);
      ...
      KeyVirtualizationInformation = KEY_INFORMATION_CLASS(5);
PS: const KeyBasicInformation: KEY_INFORMATION_CLASS = 0; geht nicht, weil Delphi macht dann eine "konstante" Variable draus -.-''


[add]
hast du nochmal die Parameter deiner APIs geprüft?

VAR, CONST und sowas kennt die WinAPI (C) ja sozusagen nicht

NtQueryKey:
var ResultLength: PULONG würde ich da eher als var ResultLength: ULONG vermuten (kenn jetzt aber die API-Definitionen nicht, aber es wird doch wohl PULONG ResultLength; sein).

richard_boderich 7. Dez 2007 18:12

Re: Large Integer? Welcher Typ in Delphi
 
@Himitsu

hast du es mal mit deinem Record getestet?

KeyInformationClass ist doch als Aufzählung definiert, oder was meinst du?

Richard

richard_boderich 7. Dez 2007 18:23

Re: Large Integer? Welcher Typ in Delphi
 
@Himitsu

Habe es jetz mit deinen Änderungen getestet. Es kracht...

Die Konstanten der Klasse Key_Information_Class habe ich als Const definiert wie von dir vorgeschlagen. Leider hat das
überhaupt keinen Einfluss. Sobald ich Time als Tfiletime definiere. -> Exeption

Gruß Richard

himitsu 7. Dez 2007 19:11

Re: Large Integer? Welcher Typ in Delphi
 
Zitat:

Zitat von richard_boderich
hast du es mal mit deinem Record getestet?

KeyInformationClass ist doch als Aufzählung definiert, oder was meinst du?

nein hab ich nicht, aber es war bisher bei allen anderen Aufzählungen so, welche ich übersetzt hab.

Heißt Delphi würde bei deinem Code nur das niederwertige Byte setzen und Windows den ganzen integer auswerten, wenn du es einfach nur als SET definierst.

Und wenn dein SET strimmt, dann stimmen auch die Werte der Konstanten ... es wird einfach nur durchgezählt.

so, ich lad mir gleich nochmal deine Demo runter ... entweder hab ich grad was zertestet, oder die Variable Test wird nirgend's zugewiesen, weßhalb da nur schrott drinsteht :gruebel:
[add]nee stimmt, TEST wird nirgends was zugewiesen, also Inhalt ist undefiniert[/add]



kannst du mal die ganzen Definitionen posten?
also das woraus du die Funktionsdefinitionen erstellt hast.

himitsu 7. Dez 2007 19:38

Re: Large Integer? Welcher Typ in Delphi
 
Liste der Anhänge anzeigen (Anzahl: 1)
ein bisl PLONG>varLONG geändert

und wenn du von NtQueryKey in KeyInformation 1024 Byte speichern lassen willst,
dann weise KeyInformation erstmal Speicher zu :!:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz