AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CopyFileProgress: negativer Wert beim Kopieren
Thema durchsuchen
Ansicht
Themen-Optionen

CopyFileProgress: negativer Wert beim Kopieren

Ein Thema von Helmi · begonnen am 20. Mär 2008 · letzter Beitrag vom 28. Mär 2008
 
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#8

Re: CopyFileProgress: negativer Wert beim Kopieren

  Alt 27. Mär 2008, 11:22
Zitat von Helmi:
Caption := IntToStr(Msg.WParam + Msg.LParam);
Du kannst die Werte aber nicht so einfach addieren - das geht schief. Wird dort wahrscheinlich zu einem Integerüberlauf kommen und die von Dir beobachteten "negativen" Zahlen treten auf. Das lustige ist, Du hast die richtige Lösung auskommentiert:

Progressbar1.Position := (Int64(Msg.LParam) shl 32) + Msg.WParam; Entsprechend sollte folgendes das gewünschte Ergebnis liefern:

Caption := IntToStr((Int64(Msg.LParam) shl 32) + Msg.WParam); Du scheinst auch nicht wirklich verstanden zu haben, was der Code genau macht. Von daher versuch ich es Dir mal zu erklären. Vereinfacht gesagt besteht ein INT64 aus 2 normalen Integern. Ein Integer ist 4 Byte groß, ein INT64 entsprechend 8 Byte. Wie stellst Du jetzt auf einem 32 Bit System einen 64 Bit Wert da. Naja, mit Hilfe von 2 32 Bit Werten. Der erste Integer (in unserem Falle LParam) nimmt die ersten 32 Bit des 64 Bit Wertes auf und der zweite Integer die letzten 32 Bit des 64 Bit Integer Wertes. Angenommen wir haben jetzt folgenden Int64 Wert:

Code:
0x1111111122222222
Dieser würde dargestellt werden durch:

Code:
LPARAM = 0x11111111
WPARAM = 0x22222222
Quizfrage:
Was passiert jetzt, wenn ich LPARAM mit WPARAM addiere?

Code:
0x11111111
0x22222222
----------
0x33333333
Das ist aber nicht, was wir eigentlich wollten. Was wir eigentlich wollten ist folgende Addition:
Code:
0x1111111100000000
0x0000000022222222
------------------
0x1111111122222222
Wir müssen also die Bytes von LPARAM nach Links verschieben. Dazu gibt es den Befehl shl (shift left = "Verschiebe nach Links"). Der Befehl "shl 32" bewirkt also, daß der Wert um 32 Bits (oder 4 Bytes) nach links verschoben wird. Nur wenn Du den Wert shiftest, macht die Addition auch das, was Du wirklich erreichen willst.

Ich hoffe mal es ist Dir jetzt klar geworden wo der Fehler war und wieso Du den Wert shiften musst .
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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-2025 by Thomas Breitkreuz