![]() |
[DCC Error] E2064 Left side cannot be assigned to
Hallo zusammen,
ich stehe irgendwie auf dem Schlau. Die folgende Zeile funktioniert unter XE2 32Bit hervorragend und unter 64Bit gibt es die Meldung wie im Titel.
Delphi-Quellcode:
Da muss also irgendwo der Wurm drin sein. Mein Vermutung liegt bei den beiden dword-Befehlen, bin mir aber nicht sicher. Könnt Ihr mir anhand der paar Zeilen sagen, warum diese Zeile unter 64Bit nicht funktioniert ?
var
FFileHandle : Cardinal; TmpSerial : array[1..20] of AnsiChar; i, j : integer; buffer : array [0..sizeof (SRB_IO_CONTROL) + sizeof (SENDCMDOUTPARAMS)] of AnsiChar; p : SRB_IO_CONTROL absolute buffer; pin : PSENDCMDINPARAMS; dummy : dword; pOut : PSENDCMDOUTPARAMS; pId : PIDSECTOR; begin result := ''; FFileHandle := CreateFileA(PAnsiChar('\\.\Scsi' + AnsiString(inttostr(devname)) + ':'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); try if FFileHandle <> INVALID_HANDLE_VALUE then begin try dword(pin) := dword(@buffer) + sizeof(SRB_IO_CONTROL); //<--- Fehler aus dem Titel fillchar(buffer, sizeof (buffer), 0); p.HeaderLength := sizeof (SRB_IO_CONTROL); p.Timeout := 1000; |
AW: [DCC Error] E2064 Left side cannot be assigned to
PSENDCMDINPARAMS ist ein Pointer und der ist unter 64-Bit halt 64-Bit lang. Damit funktioniert der Cast auf DWord nicht.
Edit: Nimm besser NativeInt. |
AW: [DCC Error] E2064 Left side cannot be assigned to
Zitat:
|
AW: [DCC Error] E2064 Left side cannot be assigned to
Hallo Ihr beiden,
danke für eure schnellen Antworten. Mit NativeInt oder IntPtr kompiliert er jetzt ohne Fehler durch. Wäre doch vergleichbar mit diesem Beispiel hier, nur ein anderer Typ ?
Delphi-Quellcode:
{$IFDEF Win32}
Inc(Integer(lgi01), SizeOf(Pointer)); {$ELSE} Inc(Int64(lgi01), SizeOf(Pointer)); {$ENDIF} |
AW: [DCC Error] E2064 Left side cannot be assigned to
Wie wäre es mit PByte bzw. um abwärtskompatibel zu bleiben PAnsiChar:
Delphi-Quellcode:
Inc(PByte(lgi01), SizeOf(Pointer));
Ich würde das übrigens so schreiben:
Delphi-Quellcode:
pin := PSENDCMDINPARAMS(PByte(@buffer) + SizeOf(SRB_IO_CONTROL));
|
AW: [DCC Error] E2064 Left side cannot be assigned to
Zitat:
|
AW: [DCC Error] E2064 Left side cannot be assigned to
Zitat:
|
AW: [DCC Error] E2064 Left side cannot be assigned to
Hallo Andreas, jetzt komme ich dahinter. Danke für Deine Erklärung.
|
AW: [DCC Error] E2064 Left side cannot be assigned to
Was auch immer geht (egal welche Delphiversion) ... PAnsiChar
Für diesen wurde eine schöne Arithmetik eingebaut (1 Byte pro addiertem Wert) PS: Wenn du del linken Cast nix zuweisen kannst, dann verschiebe den Cast nach rechts :zwinker:
Delphi-Quellcode:
pin := Pointer(PAnsiChar(@buffer) + SizeOf(SRB_IO_CONTROL)); // Pointer kann an alle Pointertypen zugewiesen werden
// oder pin := PSENDCMDINPARAMS(PAnsiChar(@buffer) + SizeOf(SRB_IO_CONTROL)); // und wäre PIN selbst ein "Pointer", dann könnte man ihm den PAnsiChar direkt zuweisen, ohne zusätzlichen Cast |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 Uhr. |
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 by Thomas Breitkreuz