![]() |
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:
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:
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;
Delphi-Quellcode:
apropro e_magic, kennt jemand magic um das in delphi ähnlich zu machen?
reinterpret_cast<IMAGE_DOS_HEADER*>(pbDLL)->e_magic
Danke im voraus! |
AW: Cast pointer zu record
In Delphi noch easier ;)
Delphi-Quellcode:
PImageDosHeader(pbDLL)^.e_magic
|
AW: Cast pointer zu record
Zitat:
und ich bin erstaunt, weil ich hatte es erst so versucht:
Delphi-Quellcode:
wo ist der unterschied zwischen ^IMAGE_DOS_HEADER und PImageDosHeader?
^IMAGE_DOS_HEADER(pbDLL)^.e_magic
Danke dir fürs schnelle Lösen des problems :) |
AW: Cast pointer zu record
Zitat:
Es gibt quasi keinen Unterschied. Das Problem ist, dass Delphi ^TImageDosHeader(ptr) nicht zulässt. Man muss vorher nen Typ dafür deklarieren (PImageDosHeader) |
AW: Cast pointer zu record
Zitat:
Naja komisch dass das so ist? Naja kann man ja nur aktzeptieren ;) Dank dir nochmals |
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. |
AW: Cast pointer zu record
Zitat:
Delphi-Quellcode:
, aber man darf es natürlich auch explizit machen.
PImageDosHeader(pbDLL).e_magic
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. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 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