Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TMemoryStream zu CreateFile ummodeln.. -.- (https://www.delphipraxis.net/139885-tmemorystream-zu-createfile-ummodeln.html)

turboPASCAL 7. Sep 2009 16:54


TMemoryStream zu CreateFile ummodeln.. -.-
 
Hi,

ich mal wieder... :stupid:

Ich möchte mir eine Art MemoryStream oder besser gesagt einen Dateiöffner basteln.
So klappts anscheind nicht, da die Daten nur Müll enthalten:

Delphi-Quellcode:
var
  mem: pointer = nil;

function(FName: PChar): bool;
var
  hFile: THandle;
  Size: Cardinal;
  dummy: Cardinal;
begin
  Result := False;

  hFile := CreateFileA(FName, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  try
  if hFile <> 0 then
  begin
    Size := GetFileSize(hFile, nil);
    GetMem(mem, Size);
    ReadFile(hFile, mem, size, dummy, nil);
  end;
  finally
    CloseHandle(hFile);
  end;

  result := (hFile <> 0) and (mem <> nil);
end;

// function MemDone ...
// FreeMem(mem);
// mem := nil
Nu ist die Frage, hab ich es richtig so ? :gruebel:

Dax 7. Sep 2009 17:00

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
Versuchs mal mit mem^ beim ReadFile.

himitsu 7. Sep 2009 17:04

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
oder TMemoryStream nehmen
.LoadFromFile die Datei laden
und .Memory zeigt auf den Speicher (würde praktisch deinem mem entsprechen)

turboPASCAL 7. Sep 2009 17:55

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
Zitat:

Zitat von Dax
Versuchs mal mit mem^ beim ReadFile.

Nö, tut's leider auch nicht.

Zitat:

Zitat von himitsu
oder TMemoryStream nehmen
.LoadFromFile die Datei laden
und .Memory zeigt auf den Speicher (würde praktisch deinem mem entsprechen)

Ja, das klappt. Auch mit nonVCL ohne die Classes zu verwenden. :stupid:

Aber ich würde es gern mal mit CreateFile & Co versuchen.

man kanns sich ja auch schwehr machen (wollen) >.<

Neutral General 7. Sep 2009 17:58

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
Gibt deine function denn true zurück?

Step mal durch. Guck mal ob die Größe (Size) stimmt. Und dann muss es wie schon gesagt mem^ heißen bei ReadFile..

Gruß
Neutral General

himitsu 7. Sep 2009 18:03

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
wenn du es wirklich schwer haben willst, dann schau in meinen FileSplitter, da hab ich das ins Extreme getrieben :oops: (ja, ich bin verspielt)

aber eigentlich sollte es so gehn
Delphi-Quellcode:
ReadFile(hFile, mem^, size, dummy, nil);


PS:
Code:
if hFile <> [b]INVALID_HANDLE_VALUE[/b] then
und das ist -1 bzw $FFFFFFFF
also bist'e dir sicher, daß deine Datei wirklich geöffnet wurde? :stupid:

PSS:
Zitat:

Nö, tut's leider auch nicht.
du solltest aber wissen, daß wir so nicht wissen was es nicht tut :zwinker:

Neutral General 7. Sep 2009 18:05

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
Hi,

Also hab mal was gebaut.. Das hier geht:

Delphi-Quellcode:
function OpenFile(FName: String): Pointer;
var h: hFile;
    len: Cardinal;
begin
  Result := nil;

  h := CreateFile(PChar(FName),GENERIC_READ,FILE_SHARE_READ,
                  nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

  if h <> INVALID_HANDLE_VALUE then
  begin
    len := GetFileSize(h,nil);
    GetMem(Result,len);
    ReadFile(h,Result^,len,len,nil);
    CloseHandle(h);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Zu Testzwecken wird auf guten Stil verzichtet :)
  Memo1.Text := PChar(OpenFile('C:\bsp.ini'));
end;

himitsu 7. Sep 2009 18:09

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
Zitat:

PChar(OpenFile('C:\bsp.ini'))
ich hoffe mal, daß zufällig hinter dem Speicher eine #0 vorkommt, denn sonst ließt er, bis es kracht

turboPASCAL 7. Sep 2009 18:29

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
Ich ... :wall:

Delphi-Quellcode:
var
  bing: pointer;

function bla(p: pointer)...

begin
  if bla(@bing) then...
end.
:dance:

Neutral General 7. Sep 2009 18:34

Re: TMemoryStream zu CreateFile ummodeln.. -.-
 
Zitat:

Zitat von himitsu
Zitat:

PChar(OpenFile('C:\bsp.ini'))
ich hoffe mal, daß zufällig hinter dem Speicher eine #0 vorkommt, denn sonst ließt er, bis es kracht

Ich würds im Ernstfall nicht so machen ;)

Das war nur schnell zum Testen obs funktioniert :zwinker:

@turboPASCAL: Das sind die tollsten Fehler :mrgreen:


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