Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bool(ean)-Wert in PByte kopieren [gelöst] (https://www.delphipraxis.net/179827-bool-ean-wert-pbyte-kopieren-%5Bgeloest%5D.html)

Dalai 4. Apr 2014 15:24

Delphi-Version: 5

Bool(ean)-Wert in PByte kopieren [gelöst]
 
Hallo Leser und Wissende :).

Ich hab mal wieder ein kleines Problem, das ich aufgrund fehlenden Wissens, Verständnisschwierigkeiten und mangelnder Suchergebnisse nicht selbst lösen kann.

Gegeben ist eine Funktion
Delphi-Quellcode:
function FsContentGetValue(FileName: PChar; FieldIndex, UnitIndex: integer;
                            FieldValue: PByte; maxlen, flags: integer):integer; stdcall;
Im Parameter FieldValue können verschiedene Typen zurückgegeben werden: Strings, Boolsche Typen, Numerische Typen, Datumsangaben usw. Strings sind ja kein Problem, denn PChar und PByte kann man hier einfach "einander zuweisen", Beispiel:
Delphi-Quellcode:
lstrcpyn(PChar(FieldValue), PChar(svc.ServiceName), maxlen);


Aber wie kann ich einen Boolschen Wert zuweisen/kopieren? Ich hab verschiedene Varianten probiert, unter anderem:
Delphi-Quellcode:
PBOOL(FieldValue):= PBOOL(LongBool(svc.OwnProcess));
PBOOL(FieldValue):= PBOOL(svc.OwnProcess);
Leider kommt dabei immer FieldValue = True raus.

In C++ würde man einfach schreiben:
Code:
*((BOOL*)FieldValue) = (svc->Interactive);
Kann mir jemand auf die Sprünge helfen?

MfG Dalai

himitsu 4. Apr 2014 15:36

AW: Bool(ean)-Wert in PByte kopieren
 
Willst du dem Zeiger, oder dem Inhalt was zuweisen?

Delphi-Quellcode:
PBOOL(FieldValue)^ := ...
, also das nächste Mal nicht das "*" vergessen. :zwinker:


Ob und wer vorher noch den Speicher reserviert, ist eine andere Sache.

Medium 4. Apr 2014 15:37

AW: Bool(ean)-Wert in PByte kopieren
 
Edit: Hab das falsch verstanden. Ich dachte du nutzt die genannte Funktion, aber du schreibst sie ja :stupid:

Aphton 4. Apr 2014 15:43

AW: Bool(ean)-Wert in PByte kopieren
 
Zitat:

Delphi-Quellcode:
PBOOL(FieldValue):= PBOOL(LongBool(svc.OwnProcess));
PBOOL(FieldValue):= PBOOL(svc.OwnProcess);

Du sagst: FieldValue, interpretiert als PBool, soll den Wert svc.OwnProcess, interpretiert als LongBool, interpretiert als PBool, haben..

Also im Grunde machst du eine 1:1 zuweisen. Der Pointer FieldValue erhält bei diesen zwei Zeilen keine Adresse sondern einen Wert!
Bei LongBool kann das alles zwischen 0 und 2^32-1 sein!
Wenn du dann FieldValue dereferenzierst, per ^, dann greifst du auf die Adresse, welche der Inhalt von OwnProcess war, zu - was eig. knallen sollte, da da meistens 0 oder 1 drinnen steht und du keinen Zugriff auf diese Adressen haben solltest.

So ists richtig:
Delphi-Quellcode:
// Zuweisung als Pointer
FieldValue := @svc.OwnProcess));

// Änderung der originalen Referenz
FieldValue^ := false; // svc.OwnProcess = false!

Dalai 4. Apr 2014 15:50

AW: Bool(ean)-Wert in PByte kopieren
 
Zitat:

Zitat von himitsu (Beitrag 1254674)
Willst du dem Zeiger, oder dem Inhalt was zuweisen?

Natürlich dem Inhalt.

Zitat:

Delphi-Quellcode:
PBOOL(FieldValue)^ := ...

Danke, das funktioniert. :thumb:

Zitat:

[...] also das nächste Mal nicht das "*" vergessen. :zwinker:
Naja, ich verwende nicht ohne Grund Delphi, um mich nicht mit Zeigerkrempel auseinandersetzen zu müssen :lol:. Ich hasse diese C++-Syntax und weiß nie, ob man referenziert oder dereferenziert und was bei vielen Klammern in einer Anweisung wie zusammengehört (Cast, Verzeigerung etc).

Zitat:

Zitat von Medium (Beitrag 1254675)
Edit: Hab das falsch verstanden. Ich dachte du nutzt die genannte Funktion, aber du schreibst sie ja :stupid:

Jein. Es ist eine Funktion für das Plugin-Interface zum Total Commander. Insofern schreibe ich sie, aber nur auf der Seite des Plugins.

MfG Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.

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