Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Large_Integer SetFilePointerEx Error 183 (https://www.delphipraxis.net/192158-large_integer-setfilepointerex-error-183-a.html)

EWeiss 23. Mär 2017 17:50


Large_Integer SetFilePointerEx Error 183
 
Hier die Fortführung aus diesen Thread.

Ich habe jetzt GetFileSizeEx mit eingebunden
Die Funktion dahingehend geändert

Delphi-Quellcode:
function TAnimatePng.FSeek(hFile: THandle; PosByte: Int64): LongInt;
var
  li: TLargeInteger; // oder Int64
begin

  li := PosByte;
  Result := 0;
  if SetFilePointerEx(hFile, li, nil, FILE_BEGIN) <> 0 then
    Result := GetLastError();
end;
dementsprechend überall PosByte: Int64 definiert und den BufferSize angepasst. BufferSize: Int64;
Kommt immer der gleiche Fehler Error 183

EDIT:
Denke mal das Problem liegt hier

Delphi-Quellcode:
if SetFilePointerEx(hFile, li, nil, FILE_BEGIN) <> 0 then


result ist aber Bool

Delphi-Quellcode:
if SetFilePointerEx(hFile, li, nil, FILE_BEGIN) = false then


hoffe mal das es so stimmt.
War wohl irgendwie überarbeitet gestern Nacht. LOL.


gruss

Zacherl 23. Mär 2017 17:57

AW: Large_Integer SetFilePointerEx Error 183
 
Delphi-Quellcode:
if SetFilePointerEx(hFile, li, nil, FILE_BEGIN) <> 0 then
  Result := GetLastError();
Solltest du nicht machen, da
Delphi-Quellcode:
GetLastError
im Erfoglsfall tatsächlich undefiniert sein bzw. noch den Status eines alten API Aufrufs zurückgeben kann.

Luckie 23. Mär 2017 18:13

AW: Large_Integer SetFilePointerEx Error 183
 
Äh:
Code:
Return value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.
Das:
Delphi-Quellcode:
if SetFilePointerEx(hFile, li, nil, FILE_BEGIN) <> 0 then
    Result := GetLastError();
ist also falsch. Du musst auf Null testen.

EWeiss 23. Mär 2017 18:31

AW: Large_Integer SetFilePointerEx Error 183
 
Ich danke für eure Hilfe aber jetzt weis ich gar nichts mehr.

auf = False, oder auf = 0, oder auf = <> 0

gruss

Luckie 23. Mär 2017 18:35

AW: Large_Integer SetFilePointerEx Error 183
 
Kommt drauf an, was du machen willst. Willst du auf den Fehlschlag reagieren auf 0.
Zitat:

If the function fails, the return value is zero. To get extended error information, call GetLastError.

EWeiss 23. Mär 2017 18:52

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Luckie (Beitrag 1365327)
Kommt drauf an, was du machen willst. Willst du auf den Fehlschlag reagieren auf 0.
Zitat:

If the function fails, the return value is zero. To get extended error information, call GetLastError.

also SetFilePointer Rückgabe = DWORD also <> 0
Delphi-Quellcode:
  if SetFilePointer(hFile, li, nil, FILE_BEGIN) <> 0 then


gleicht error 183.

SetFilePointerEx Rückgabe = BOOL
Delphi-Quellcode:
  if SetFilePointerEx(hFile, li, nil, FILE_BEGIN) = false then


Was soll da jetzt falsch sein?

gruss

Luckie 23. Mär 2017 18:54

AW: Large_Integer SetFilePointerEx Error 183
 
Ah. Das ist der Krampf mit den unterschiedlichen Definitionen von Wahrheitswerten von Delphi und WinAPI. Was ist denn Fehler 183 überhaupt?

Zacherl 23. Mär 2017 18:57

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Luckie (Beitrag 1365335)
Was ist denn Fehler 183 überhaupt?

Zitat:

ERROR_ALREADY_EXISTS
183 (0xB7)
Cannot create a file when that file already exists.
Macht irgendwie wenig Sinn im Zusammenhang mit der genannten API.

@Emil:
Kannst du mal mehr Code zeigen?

EWeiss 23. Mär 2017 19:03

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Zacherl (Beitrag 1365336)
Zitat:

Zitat von Luckie (Beitrag 1365335)
Was ist denn Fehler 183 überhaupt?

Zitat:

ERROR_ALREADY_EXISTS
183 (0xB7)
Cannot create a file when that file already exists.
Macht irgendwie wenig Sinn im Zusammenhang mit der genannten API.

@Emil:
Kannst du mal mehr Code zeigen?

Jo ;)

Ich öffne die Datei auf diese weise


Delphi-Quellcode:
    if FOpen(PWideChar(wsFile), 0, 0, hFileIn) = 0 then
    begin
Delphi-Quellcode:
function TAnimatePng.FOpen(FileName: PWideChar; AccessMode: DWORD; ShareMode: DWORD;
  var hFile: THandle): DWORD;
var
  AccessIs: DWORD;
  ShareIs: DWORD;
  FlagAndAttribute: DWORD;
begin
  AccessMode := min(max(AccessMode, 0), 2);
  //0 Nur lesend öffnen.
  if AccessMode = 0 then
    AccessIs := GENERIC_READ
  // 1 Nur zum schreiben öffnen.
  else if AccessMode = 1 then
    AccessIs := GENERIC_WRITE
  // 2 Zum Schreiben und lesen öffen
  else
  AccessIs := GENERIC_READ or GENERIC_WRITE;

  // Kohärenz zwischen 1-4
  ShareMode := min(max(ShareMode, 1), 4);
  // 1 Verweigerter Lese/Schreibzugriff.
  if ShareMode = 1 then
    ShareIs := 0
  // 2 Verweigerter Schreibzugriff
  else if ShareMode = 2 then
    ShareIs := FILE_SHARE_READ
  // 3 Verweigerter Lesezugriff
  else if ShareMode = 3 then
    ShareIs := FILE_SHARE_WRITE
  // 4 Vollerzugriff
  else
  ShareIs := FILE_SHARE_READ or FILE_SHARE_WRITE;

  if hFile = INVALID_HANDLE_VALUE then
    FlagAndAttribute := FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH
  else
  FlagAndAttribute := FILE_ATTRIBUTE_NORMAL;

  hFile := CreateFile(FileName, AccessIs, ShareIs, nil, OPEN_ALWAYS, FlagAndAttribute, 0);

  if hFile = INVALID_HANDLE_VALUE then
  begin
    Result := GetLastError();
    hFile := 0;
    exit;
  end;
  Result := 0;
end;
Hilft das ?

gruss

Zacherl 23. Mär 2017 19:13

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von EWeiss (Beitrag 1365338)
Hilft das ?

Jep. MSDN-Library durchsuchenCreateFile sagt im Bezug auf
Delphi-Quellcode:
OPEN_ALWAYS
folgendes:
Zitat:

Opens a file, always.
If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS (183).
If the specified file does not exist and is a valid path to a writable location, the function creates a file and the last-error code is set to zero.
Dementsprechend vermute ich, dass bereits dieser Aufruf bereits den 183 erzeugt und durch irgendeinen Logik Fehler (evtl. Der, den Luckie schon gefunden hatte) liest deine nachfolgende Routine den alten Code aus.

Edit:
Warum machst du das ganze Gedöhns eigentlich manuell mit der WinAPI und verwendest nicht
Delphi-Quellcode:
TFileStream
?

EWeiss 23. Mär 2017 19:18

AW: Large_Integer SetFilePointerEx Error 183
 
[QUOTE=Zacherl;1365342]
Zitat:

Zitat von EWeiss (Beitrag 1365338)
Hilft das ?

Jep. MSDN-Library durchsuchenCreateFile sagt im Bezug auf
Delphi-Quellcode:
OPEN_ALWAYS
folgendes:
Zitat:

Opens a file, always.
If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS (183).
If the specified file does not exist and is a valid path to a writable location, the function creates a file and the last-error code is set to zero.
Dementsprechend vermute ich, dass bereits dieser Aufruf bereits den 183 erzeugt und durch irgendeinen Logik Fehler (evtl. Der, den Luckie schon gefunden hatte) liest deine nachfolgende Routine den alten Code aus.

Edit:
Zitat:

Warum machst du das ganze Gedöhns eigentlich manuell mit der WinAPI und verwendest nicht
Delphi-Quellcode:
TFileStream
?
Dann gehe ich davon aus das ich gar nicht auf large_integer umsteigen muss oder? Hab noch keine APNG in der Größe von mehr wie 2GB gesehen.
Denn auch hier wird der selbe Fehler generiert.

Ignorieren oder was tun? Das ist die Frage. LOL

EDIT:
Zitat:

Warum machst du das ganze Gedöhns eigentlich manuell mit der WinAPI und verwendest nicht TFileStream ?
Würde ich gerne tun wenn ich wüsste wie.
Hab da noch nicht viel mit gemacht. ;)



gruss

Luckie 23. Mär 2017 19:21

AW: Large_Integer SetFilePointerEx Error 183
 
Er will die VCL nicht einbinden. Und dazu zählen für ihn auch die nicht sichtbaren Klassen.

EWeiss 23. Mär 2017 19:26

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Luckie (Beitrag 1365345)
Er will die VCL nicht einbinden. Und dazu zählen für ihn auch die nicht sichtbaren Klassen.

Nein hat damit nichts zu tun ;)
Würde TFileStream verwenden wenn ich damit mehr Erfahrung hätte.

Wüsste jetzt nicht das TFileStream ein THandle zurück liefert.
Und wie ich solche dinge damit behandeln sollte

Delphi-Quellcode:
BufferSize := FLof(hFileIn) - anih.offset - sizeof(anih) + 1;


Der sinn des ganzen ist, eine APNG Classe zur Verfügung zu stellen ohne 1000 Units einer mitunter nicht funktionierenden Library einzubinden.
Ich bin gern unabhängig von fremden Komponenten und mit den Aufwand diese alle einzubinden.
Das ist ein Hobby von mir und ich teile gern.


gruss

Luckie 23. Mär 2017 19:32

AW: Large_Integer SetFilePointerEx Error 183
 
Tut es, aber nur intern, davon bekommst du nichts mit, weil es in der TFileStream Klasse gekapselt wird. Aber, ich glaube, man kann kann das handle über eine Property abfragen.

Zacherl 23. Mär 2017 19:34

AW: Large_Integer SetFilePointerEx Error 183
 
Das Problem ist NICHT MSDN-Library durchsuchenSetFilePointer oder MSDN-Library durchsuchenSetFilePointerEx, sondern ein Logikfehler an anderer Stelle, der deine eigene
Delphi-Quellcode:
Seek
-Funktion fälschlicherweise den alten Error Code von MSDN-Library durchsuchenCreateFile zurückgeben lässt. Sprich: Eigentlich gibt es keinen Fehler, aber dein eigener Code denkt dennoch, dass Einer aufgetreten ist. Dieses Logikproblem solltest du als allererstes beheben. Danach - wenn es tatsächlich Non-VCL und auch Non-RTL sein soll - würde ich auf
Delphi-Quellcode:
OPEN_EXISTING
umsteigen, da es für deinen rein lesenden Anwendungszweck die deutlich bessere Wahl ist.

Wenn die RTL bzw.
Delphi-Quellcode:
TFileStream
ok ist, dann wäre dies auf jeden Fall die allereinfachste Möglichkeit. Das eigentliche Datei-Handle wird vom Stream weggekapselt, aber das solltest du eigentlich auch gar nicht benötigen. Btw.
Delphi-Quellcode:
TFileStream
unterstützt (zumindest in Delphi 10.1) auch ein
Delphi-Quellcode:
Seek
mit 64-Bit Offset, wobei das wohl tatsächlich bei dir nicht von Relevanz ist.

EWeiss 23. Mär 2017 19:35

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Luckie (Beitrag 1365348)
Tut es, aber nur intern, davon bekommst du nichts mit, weil es in der TFileStream Klasse gekapselt wird. Aber, ich glaube, man kann kann das handle über eine Property abfragen.

Wie gesagt wenn sich jemand bereit erklärt das Step für Step mit mir durchzugehen würde ich lieber die TFileStream Klasse verwenden.
Zumal der Code dadurch übersichtlicher wird.
Alleine schaffe ich das nicht.

gruss

EWeiss 23. Mär 2017 19:37

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

da es für deinen rein lesenden Anwendungszweck die deutlich bessere Wahl ist.
Im Moment noch aber später nicht mehr.
Denn ich muss die geänderten Geschwindigkeiten in das APNG hinein schreiben.

gruss

Zacherl 23. Mär 2017 19:39

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von EWeiss (Beitrag 1365352)
Zitat:

da es für deinen rein lesenden Anwendungszweck die deutlich bessere Wahl ist.
Im Moment noch aber später nicht mehr.
Denn ich muss die geänderten Geschwindigkeiten in das APNG hinein schreiben.

Okay, aber trotzdem willst du ja allerhöchstens die bereits existierende PNG modifizieren und nicht im Falle der Nicht-Existenz eine leere Datei erstellen.

EWeiss 23. Mär 2017 19:40

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Zacherl (Beitrag 1365353)
Zitat:

Zitat von EWeiss (Beitrag 1365352)
Zitat:

da es für deinen rein lesenden Anwendungszweck die deutlich bessere Wahl ist.
Im Moment noch aber später nicht mehr.
Denn ich muss die geänderten Geschwindigkeiten in das APNG hinein schreiben.

Okay, aber trotzdem willst du ja allerhöchstens die bereits existierende PNG modifizieren und nicht im Falle der Nicht-Existenz eine leere Datei erstellen.

Richtig :thumb:

EDIT:
Wenn Interesse besteht könnte man ja einen neuen Thread aufsetzen der sich mit dem TFileStream befasst.
Wäre auch unterumständen Interessant für andere Community Mitglieder ;)

gruss

Luckie 23. Mär 2017 19:53

AW: Large_Integer SetFilePointerEx Error 183
 
Dazu gibt es bestimmt in Netz Tutorials.

EWeiss 23. Mär 2017 20:10

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Luckie (Beitrag 1365356)
Dazu gibt es bestimmt in Netz Tutorials.

Möglich aber wofür haben wir hier das Forum ?
Wenn ich alles im Netzt suche brauche ich nicht hier Angemeldet zu sein oder?
Zumal das dann andere davon auch profitieren könnten.

gruss

Neutral General 23. Mär 2017 20:35

AW: Large_Integer SetFilePointerEx Error 183
 
Würde ich so nicht sagen.
Die Forenmitglieder sind ja nicht dein persönliches Tutorial.
Foren sind da um Fragen zu speziellen Problemen zu stellen, nicht um komplette Themen zu lernen ;)

TFileStream ist auch nicht wirklich schwer zu benutzen. Es gibt sicher Tutorials aber ich denke man kann da im Zweifelsfall auch allein ganz gut zurecht kommen wenn man sich die Klasse mal anschaut und ein bisschen ausprobiert.

Luckie 23. Mär 2017 20:53

AW: Large_Integer SetFilePointerEx Error 183
 
Verständnisfragen sind hier immer willkommen. Meine Tutorials sind aus meiner Neugier entstanden.

Zacherl 23. Mär 2017 21:12

AW: Large_Integer SetFilePointerEx Error 183
 
Im Grunde ist
Delphi-Quellcode:
TFileStream
recht simpel: Der Constructor ist das Äquivalent zu MSDN-Library durchsuchenCreateFile, MSDN-Library durchsuchenSetFilePointer ist
Delphi-Quellcode:
Seek
, MSDN-Library durchsuchenReadFile ist
Delphi-Quellcode:
Read
und MSDN-Library durchsuchenGetFileSize einfach
Delphi-Quellcode:
TFileStream.Size
. Die Parameter sind ebenfalls recht ähnlich.

EWeiss 23. Mär 2017 21:13

AW: Large_Integer SetFilePointerEx Error 183
 
Will mich jetzt nicht hier rumstreiten. Sei's drum.
Definitiv ist aber mit dem Stream in welcher weise er auch generiert wird etwas nicht in Ordnung.
Muss noch was ackern und analysieren hab ja sonst nix zu tun.
siehe Pic

Zitat:

Meine Tutorials sind aus meiner Neugier entstanden.
Die hast du hier aber auch groß breitgetreten wie auch immer.
Aber andere dürfen ihre Themen nicht ausleben ok kein Problem für mich. :cheers: wird jetzt OT:

gruss

EWeiss 23. Mär 2017 21:23

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Zacherl (Beitrag 1365368)
Im Grunde ist
Delphi-Quellcode:
TFileStream
recht simpel: Der Constructor ist das Äquivalent zu MSDN-Library durchsuchenCreateFile, MSDN-Library durchsuchenSetFilePointer ist
Delphi-Quellcode:
Seek
, MSDN-Library durchsuchenReadFile ist
Delphi-Quellcode:
Read
und MSDN-Library durchsuchenGetFileSize einfach
Delphi-Quellcode:
TFileStream.Size
. Die Parameter sind ebenfalls recht ähnlich.

Danke dir für die Infos.
Muss mich damit mal beschäftigen auch wenn es nicht gerade von Erfolg gekrönt ist.

gruss

EWeiss 23. Mär 2017 21:55

AW: Large_Integer SetFilePointerEx Error 183
 
Ich habe mich jetzt mal drangegeben.. Bisher sieht es so aus.

Delphi-Quellcode:
    //if FOpen(PWideChar(wsFile), 0, 0, hFileIn) = 0 then
    FileStream := TFileStream.Create(wsFile, fmOpenRead);
    if FileStream.Handle <> 0 then
    begin
      DC := CreateIC('DISPLAY', nil, nil, nil);
      ImgHDC := CreateCompatibleDC(DC);

      hDIB := SKAERO_CreateDIBSection(ImgHDC, anih.Width * anih.Frame, anih.Height, 32);
      SelectObject(ImgHDC, hDIB);
      if GDIP_CreateFromHDC(ImgHDC, Graphics) = OK then
      begin
        BufferSize := FileStream.Size - anih.offset - sizeof(anih) + 1;
        SetLength(sBuffer, BufferSize);
        FileStream.Seek(anih.offset - 1, soFromBeginning);
        FileStream.Read(sBuffer, BufferSize); //BufferSize sollte in Ordnung sein da kleiner wie FileStream.Size
        //if FGetAt(FileStream.Handle, anih.offset - 1, sBuffer) = S_OK then
        //begin
FileStream.Read füllt den sBuffer nicht der als TBytes definiert ist.

gruss

Uwe Raabe 23. Mär 2017 23:04

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von EWeiss (Beitrag 1365378)
FileStream.Read füllt den sBuffer nicht der als TBytes definiert ist.

Das muss ja auch so heißen:
Delphi-Quellcode:
        FileStream.Read(sBuffer[0], BufferSize);

EWeiss 23. Mär 2017 23:08

AW: Large_Integer SetFilePointerEx Error 183
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1365406)
Zitat:

Zitat von EWeiss (Beitrag 1365378)
FileStream.Read füllt den sBuffer nicht der als TBytes definiert ist.

Das muss ja auch so heißen:
Delphi-Quellcode:
        FileStream.Read(sBuffer[0], BufferSize);

Danke Uwe habe es im anderen Thread schon bereinigt ;)

grusss


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