Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Cast pointer zu record (https://www.delphipraxis.net/197736-cast-pointer-zu-record.html)

Lyan 31. Aug 2018 14:28

Delphi-Version: 10.2 Tokyo

Cast pointer zu record
 
Hi,

ich portiere gerade eine Funktion aus meinem C++ Code nach Delphi und ich habe Delphi leider verlernt wie es scheint und verzweifle gerade daran zu casten:

Delphi-Quellcode:
  hFile := CreateFileA(szDllName, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if hFile <> INVALID_HANDLE_VALUE then
  begin
    dwSize := GetFileSize(hFile, nil);
    pbDLL := GetMemory(dwSize);
    ReadFile(hFile, pbDLL, dwSize, dwRead, nil);
    CloseHandle(hFile);

    if IMAGE_DOS_HEADER(pbDLL).e_magic <> $5A4D then
    begin

    end;
  end;
Es geht um den cast zu IMAGE_DOS_HEADER. Ich möchte nicht extra eine variable anlegen und size of dos header rein lesen. In c++ ist es easy:

Delphi-Quellcode:
reinterpret_cast<IMAGE_DOS_HEADER*>(pbDLL)->e_magic
apropro e_magic, kennt jemand magic um das in delphi ähnlich zu machen?

Danke im voraus!

Neutral General 31. Aug 2018 14:35

AW: Cast pointer zu record
 
In Delphi noch easier ;)

Delphi-Quellcode:
PImageDosHeader(pbDLL)^.e_magic

Lyan 31. Aug 2018 14:42

AW: Cast pointer zu record
 
Zitat:

Zitat von Neutral General (Beitrag 1412127)
In Delphi noch easier ;)

Delphi-Quellcode:
PImageDosHeader(pbDLL)^.e_magic

Naja das ist dann quasi C-Style, könnte ich so auch in c++ machen :thinking:.

und ich bin erstaunt, weil ich hatte es erst so versucht:

Delphi-Quellcode:
^IMAGE_DOS_HEADER(pbDLL)^.e_magic
wo ist der unterschied zwischen ^IMAGE_DOS_HEADER und PImageDosHeader?

Danke dir fürs schnelle Lösen des problems :)

Neutral General 31. Aug 2018 14:46

AW: Cast pointer zu record
 
Zitat:

Zitat von Winapi.Windows.pas
PImageDosHeader = ^TImageDosHeader


Es gibt quasi keinen Unterschied.
Das Problem ist, dass Delphi ^TImageDosHeader(ptr) nicht zulässt.
Man muss vorher nen Typ dafür deklarieren (PImageDosHeader)

Lyan 31. Aug 2018 15:01

AW: Cast pointer zu record
 
Zitat:

Zitat von Neutral General (Beitrag 1412130)
Delphi-Quellcode:
PImageDosHeader = ^TImageDosHeader


Es gibt quasi keinen Unterschied.
Das Problem ist, dass Delphi ^TImageDosHeader(ptr) nicht zulässt.
Man muss vorher nen Typ dafür deklarieren (PImageDosHeader)

Ach ja da war was, ich erinnere mich das "problem" früher mal auch bei parametern gehabt zu haben.
Naja komisch dass das so ist? Naja kann man ja nur aktzeptieren ;)

Dank dir nochmals

Neutral General 31. Aug 2018 15:09

AW: Cast pointer zu record
 
Ach ja moment - was alternativ auch gehen müsste wäre:
Delphi-Quellcode:
IMAGE_DOS_HEADER(pbDLL^).e_magic


Dann brauchst du keinen neuen Typ.

himitsu 31. Aug 2018 22:46

AW: Cast pointer zu record
 
Zitat:

Zitat von Neutral General (Beitrag 1412127)
In Delphi noch easier ;)

Delphi-Quellcode:
PImageDosHeader(pbDLL)^.e_magic

Delphi dereferenziert Records automatisch implizit, wenn man auf Felder zugreift.

Delphi-Quellcode:
PImageDosHeader(pbDLL).e_magic
, aber man darf es natürlich auch explizit machen.



ReadFile ohne Prüfung der Rückgabewerte und CloseFile nicht in einem Ressourcenschutzblock ... schäm dich.

PS: Um noch mehr zu Delphi zu wechseln, könnte man auch TFileStream benutzen
oder einfach einen TMemoryStream nehmen und dort direkt auf den internen Speicher zugreifen.
Delphi-Referenz durchsuchenTCustomMemoryStream.Memory


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