Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Der linken Seite kann nichts zugewiesen werden (https://www.delphipraxis.net/176307-der-linken-seite-kann-nichts-zugewiesen-werden.html)

Codehunter 26. Aug 2013 15:24

Delphi-Version: 5

Der linken Seite kann nichts zugewiesen werden
 
Hallo!

Ich migriere grad ein Projekt von D7 nach XE4 und bei folgender Zeile bekomme ich die besagte Fehlermeldung:

Delphi-Quellcode:
Byte(bufPtr[ix]) := StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0);
Der Code compiliert im D7 problemlos aber eben nicht in XE4 :-(

Danke für eure Hilfe!
Cody

mkinzler 26. Aug 2013 15:28

AW: Der linken Seite kann nichts zugewiesen werden
 
Was für einen Typ hat bufPtr? Ein String?

p80286 26. Aug 2013 16:08

AW: Der linken Seite kann nichts zugewiesen werden
 
Delphi-Quellcode:
Byte(bufPtr[ix]) :=Byte( StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0));
oder
Delphi-Quellcode:
Byte(bufPtr[ix]) :=Byte( StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0) and $FF);
Versuch es mal so (ich geh mal davon aus, daß bufPtr trotz des Namens einn Array oder ähnliches ist)

Gruß
K-H

sx2008 26. Aug 2013 16:09

AW: Der linken Seite kann nichts zugewiesen werden
 
Du darfst/solltest auf der linken Seite keinen Cast einsetzen.
Ich gehe mal davon aus, dass bufPtr den Datentyp
Delphi-Quellcode:
PByte
oder
Delphi-Quellcode:
array of Byte
hat:
Delphi-Quellcode:
bufPtr[ix] := Byte(StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0));
// evtl. auch so
(bufPtr +ix)^ := Byte(StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0))

zeras 26. Aug 2013 17:34

AW: Der linken Seite kann nichts zugewiesen werden
 
Kann es sein, dass Byte(bufPtr[ix]) dazumals als Konstante definiert wurde?
Ich hatte einmal einen ähnlichen Fall, wo ich ein Projekt auf D2009 hochgezogen hatte und da kamen gleiche Fehlermeldungen. Von welcher Version das kam, weiß ich leider nicht mehr.
Offensichtlich war es unter alten Delphi/Pascal Ständen noch erlaubt, eine Konstante zu ändern.

Codehunter 26. Aug 2013 19:39

AW: Der linken Seite kann nichts zugewiesen werden
 
Und ich dachte bisher immer, schreibbare Konstanten wären ein Feature neuerer Delphiversionen ;-)

Ich habs grad nicht vor mir aber aus dem Kopf meine ich, BufPtr ist ein Array of AnsiChar und als Variable deklariert. Genaueres kann ich erst morgen sagen.

baumina 27. Aug 2013 07:42

AW: Der linken Seite kann nichts zugewiesen werden
 
Zitat:

Zitat von zeras (Beitrag 1226290)
Offensichtlich war es unter alten Delphi/Pascal Ständen noch erlaubt, eine Konstante zu ändern.

Dafür gibt es eine Compiler-Einstellung : zuweisbare typisierte Konstanten

Ist diese True, dann müsste das klappen.

Codehunter 27. Aug 2013 07:46

AW: Der linken Seite kann nichts zugewiesen werden
 
Ok, Problem gelöst. Hier der Originalcode:
Delphi-Quellcode:
var
  ix           : Integer;
  bufPtr       : PChar;
  hexDump      : AnsiString;
begin
  hexDump := ReadAnsiString(aSection,aKey,'');
  Result := Length(hexDump) DIV 2;
  if Result > BufSize then Result := BufSize;

  bufPtr := Pointer(Buffer);
  for ix := 0 to Result -1 do
  begin
    Byte(bufPtr[ix]) := StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0);
  end;
end;
Die Deklaration von bufPtr habe ich in PAnsiChar geändert und schon rockts.

Zacherl 27. Aug 2013 16:32

AW: Der linken Seite kann nichts zugewiesen werden
 
Mal zu deiner ursprünglichen Frage. Ausgehend davon, dass bufPtr ein Array of (Ansi)Char ist, würde folgendes Funktionieren:
Delphi-Quellcode:
bufPtr[ix] := Char(StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0));
Sprich: Immer die rechte Seite in den Typ der linken Seite casten und nicht umgekehrt.

Alternativ sollte auch das funktionieren (ist aber unschön):
Delphi-Quellcode:
PByte(@bufPtr[ix])^ := StrToIntDef('$' + Copy(hexDump,1 + ix*2,2) ,0);
Dein Problem war aber vermutlich grade eher, dass du nicht berücksichtigt hattest, dass XE4 im Gegensatz zu D7 jetzt Unicode (2Byte) Chars verwendet.

jaenicke 28. Aug 2013 04:42

AW: Der linken Seite kann nichts zugewiesen werden
 
Zitat:

Zitat von Codehunter (Beitrag 1226297)
Und ich dachte bisher immer, schreibbare Konstanten wären ein Feature neuerer Delphiversionen ;-)

Um genau zu sein konnte man diese unsaubere Methode bei Delphi 1 nutzen. Ich glaube schon seit Delphi 2 ist die Standardeinstellung, dass Konstanten genau das sind: konstant...

Blup 28. Aug 2013 07:39

AW: Der linken Seite kann nichts zugewiesen werden
 
Das man den Wert typisierter Konstanten ändern kann, ist meines Wissens nach auch bei Delphi 2007 noch Standard.

gammatester 28. Aug 2013 07:56

AW: Der linken Seite kann nichts zugewiesen werden
 
Zitat:

Zitat von jaenicke (Beitrag 1226442)
Zitat:

Zitat von Codehunter (Beitrag 1226297)
Und ich dachte bisher immer, schreibbare Konstanten wären ein Feature neuerer Delphiversionen ;-)

Um genau zu sein konnte man diese unsaubere Methode bei Delphi 1 nutzen. Ich glaube schon seit Delphi 2 ist die Standardeinstellung, dass Konstanten genau das sind: konstant...

Ich verstehe ehrlich nicht, was mit der andauernden 'Verteufelung' von typsierten Konstanten hier im Forum bezweckt werden soll, denn
  • {$J-} ist als Standard erst bei D6 und nicht schon D2 eingeführt worden,
  • alte Delphis kennen keine initialisierte Variablen,
  • man kann ja Konstanten verwenden, wenn man will,
  • es gibt selbst bei den neuesten Delphis keine Möglichkeit, initialisierte lokale Variable zu benutzen (Error: E2195 Cannot initialize local variables) und man muß eh wieder auf die ungeliebten typisierten Konstanten zurückgreifen.

jaenicke 28. Aug 2013 15:13

AW: Der linken Seite kann nichts zugewiesen werden
 
Um genau zu sein nicht typisierte Konstanten, sondern deren Veränderung empfinde ich als unsauber.
Wenn const dransteht, erwartet man nun einmal auch einen konstanten Wert. Wenn der dann plötzlich irgendwo geändert wird, kann man bei fremden Quelltexten ewig suchen bis man das erstens sieht und zweitens findet wo das passiert.

Wenn man eine Variable will, denn nichts anderes ist eine "Konstante" (haha), die man ändern kann, dann sollte man auch eine nehmen und damit kundtun, dass der Wert eben nicht konstant ist.

Zitat:

Zitat von gammatester (Beitrag 1226450)
es gibt selbst bei den neuesten Delphis keine Möglichkeit, initialisierte lokale Variable zu benutzen

Wäre ja auch Blödsinn, das kann man ja die paar Zeilen später selbst machen, wenn man dort eh Werte zuweist. Bei sauberem Quelltext sind die einzelnen Methoden ja auch nicht lang.

schöni 28. Aug 2013 15:38

AW: Der linken Seite kann nichts zugewiesen werden
 
Ich programmiere zwar nicht mehr mit Delphi. Zu viel Lernaufwand, wenn man das zuhause im stillen Kämmerlein machen muss. Habe aber gestern mit gelesen, den Strang "Delphi und Freepascal neu lernen".

Da ging es auch um Schutz des Quellcodes vor fremden Augen.

Wären da solch typisierte Konstanten nicht was? Wenn Jaenicke schreibt, das er da wegen Veränderunf solcher Konstanten ewig im Quelltext sucht, könnte dies doch auch einem unbefugten das Leben schwer machen, den Programmcode zu knacken? Oder?

hier die Ausführung dazu von jaenicke:

Zitat:

Wenn const dransteht, erwartet man nun einmal auch einen konstanten Wert. Wenn der dann plötzlich irgendwo geändert wird, kann man bei fremden Quelltexten ewig suchen bis man das erstens sieht und zweitens findet wo das passiert.
Könnte man also diesen Effekt wie andere Tricks nutzen, um seinen Code zu schützen.

Nur mal so gefragt.

Ich habe durchaus auch die Auffassung von Microsoft im og. Thread gestern gelesen, das nämlich ein Schutz mit Obfuscator bei .NET Code ziemlich wertlos ist, weil der Code ohne großen Aufwand wieder entschlüsselt werden kann.

Wie aber sähe die Sache bei zum Beispiel Verwendung typisierter Konstanten im von jaenicke angeprangerten Sinne aus?

Zitat:

Um genau zu sein nicht typisierte Konstanten, sondern deren Veränderung empfinde ich als unsauber.
...
einerseits richtig, allerdings wünsche ich mir dann aber initialisierbare Variablen. Warum diese in neuesten Delphi Versionen auch nicht mehr?

jaenicke 28. Aug 2013 15:44

AW: Der linken Seite kann nichts zugewiesen werden
 
Zitat:

Zitat von schöni (Beitrag 1226532)
einerseits richtig, allerdings wünsche ich mir dann aber initialisierbare Variablen. Warum diese in neuesten Delphi Versionen auch nicht mehr?

Das geht ja auch, aber nicht bei lokalen Variablen. Da macht das meiner Meinung nach aber auch keinerlei Sinn.

Im kompilierten Code ist so etwas jedenfalls kein Schutz. Es ist ja im generierten Code wie eine Variable.

Zitat:

Zitat von schöni (Beitrag 1226532)
Ich habe durchaus auch die Auffassung von Microsoft im og. Thread gestern gelesen, das nämlich ein Schutz mit Obfuscator bei .NET Code ziemlich wertlos ist, weil der Code ohne großen Aufwand wieder entschlüsselt werden kann.

Naja, also bei einem Obfuscator ist das, wenn er gut ist, nicht so einfach. Und z.B. die Variablennamen lassen sich gar nicht mehr wiederherstellen.
Wer Assembler kann, für den ist es auch nicht schwerer disassemblierten Delphicode zu lesen, eher einfacher, weil da nichts verfälscht ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 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