AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Cast pointer zu record

Ein Thema von Lyan · begonnen am 31. Aug 2018 · letzter Beitrag vom 31. Aug 2018
Antwort Antwort
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#1

Cast pointer zu record

  Alt 31. Aug 2018, 15:28
Delphi-Version: 10.2 Tokyo
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:

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

Danke im voraus!
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Cast pointer zu record

  Alt 31. Aug 2018, 15:35
In Delphi noch easier

PImageDosHeader(pbDLL)^.e_magic
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (31. Aug 2018 um 15:39 Uhr)
  Mit Zitat antworten Zitat
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#3

AW: Cast pointer zu record

  Alt 31. Aug 2018, 15:42
In Delphi noch easier

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:

^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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Cast pointer zu record

  Alt 31. Aug 2018, 15:46
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)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Lyan

Registriert seit: 5. Aug 2011
188 Beiträge
 
#5

AW: Cast pointer zu record

  Alt 31. Aug 2018, 16:01
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Cast pointer zu record

  Alt 31. Aug 2018, 16:09
Ach ja moment - was alternativ auch gehen müsste wäre:
IMAGE_DOS_HEADER(pbDLL^).e_magic

Dann brauchst du keinen neuen Typ.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Cast pointer zu record

  Alt 31. Aug 2018, 23:46
In Delphi noch easier

PImageDosHeader(pbDLL)^.e_magic
Delphi dereferenziert Records automatisch implizit, wenn man auf Felder zugreift.

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
$2B or not $2B

Geändert von himitsu ( 1. Sep 2018 um 00:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 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