Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TByteSOAPArray vs. TByteDynArray (https://www.delphipraxis.net/208413-tbytesoaparray-vs-tbytedynarray.html)

Samashy 26. Jul 2021 11:46

TByteSOAPArray vs. TByteDynArray
 
Hallo,

ich versuche ein bestehendes Tool auf 64Bit hochzuziehen.
Das Tool füttert einen Restservice mit Dateien. In der 32Bit Variante forderte der Webservice:
Code:
const content: TByteDynArray
und in 64
Code:
const content: TByteSOAPArray
Mit dieser Funktion:
Code:
function FileToByteArray( const FileName : string ) : TByteDynArray; stdcall;
  const BLOCK_SIZE=1024;
  var BytesRead, BytesToWrite, Count : integer;
    F : FIle of Byte;
    pTemp : Pointer;
  begin
    AssignFile( F, FileName );
    Reset(F);
    try
      Count := FileSize( F );
      SetLength(Result, Count );
      pTemp := @Result[0];
      BytesRead := BLOCK_SIZE;
      while (BytesRead = BLOCK_SIZE ) do
      begin
        BytesToWrite := Min(Count, BLOCK_SIZE);
        BlockRead(F, pTemp^, BytesToWrite , BytesRead );
        pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE);
        Count := Count-BytesRead;
      end;
  finally
    CloseFile( F );
  end;
 end;
hatte ich bisher die Datei in das Array geschrieben.

Wie muss ich diese Funktion umschreiben?

DeddyH 26. Jul 2021 11:55

AW: TByteSOAPArray vs. TByteDynArray
 
TByteSOAPArray
Wenn ich das richtig sehe, musst Du nur den Rückgabetypen ändern.

Samashy 26. Jul 2021 12:03

AW: TByteSOAPArray vs. TByteDynArray
 
Sorry das habe ich vergessen zu schreiben:
Das habe ich probiert, aber dann kommt ein i/o 998 Fehler.
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt xxx ist eine Exception der Klasse EInOutError mit der Meldung 'E/A-Fehler 998' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

DeddyH 26. Jul 2021 12:06

AW: TByteSOAPArray vs. TByteDynArray
 
An welcher Stelle knallt es denn? Ich glaube eher nicht, dass es am Rückgabetypen liegt. Hast Du mal versucht, die alten Pascal-Routinen (AssignFile, BlockRead, etc.) durch Streams zu ersetzen?

Samashy 26. Jul 2021 12:24

AW: TByteSOAPArray vs. TByteDynArray
 
Nein leider nicht, mit Streams habe ich noch nichts gemacht.

es knallt in der While-Schleife bei der zweiten Runde

Code:
 while (BytesRead = BLOCK_SIZE ) do
      begin
        BytesToWrite := Min(Count, BLOCK_SIZE);
        BlockRead(F, pTemp^, BytesToWrite , BytesRead );
        pTemp := Pointer(LongInt(pTemp) + BLOCK_SIZE);
        Count := Count-BytesRead;
      end;
Speziell bei der Zeile:
Code:
 BlockRead(F, pTemp^, BytesToWrite , BytesRead );

Der schöne Günther 26. Jul 2021 12:53

AW: TByteSOAPArray vs. TByteDynArray
 
Ich versuche die Logik erst gar nicht zu verstehen, aber dass LongInt auf Windows immer 4 Byte sind (während Pointer halt entweder 4 oder 8 Byte sind) ist dir klar, oder?

Samashy 26. Jul 2021 14:51

AW: TByteSOAPArray vs. TByteDynArray
 
Danke, habe auf Int64 umgestellt

Werde mich aber zusätzlich mal mit FileStream beschäftigen


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