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 OffsetOf Delphi ekvivalent? (https://www.delphipraxis.net/145306-offsetof-delphi-ekvivalent.html)

nanix 29. Dez 2009 09:19


OffsetOf Delphi ekvivalent?
 
Is there such function in delphi ?


Thanks

Klaus01 29. Dez 2009 09:24

Re: OffsetOf Delphi ekvivalent?
 
Can you describe in some words
what the original function is doing?

Best regards
Klaus

nanix 29. Dez 2009 09:25

Re: OffsetOf Delphi ekvivalent?
 
Zitat:

size_t offsetof(
structName,
memberName
);
http://msdn.microsoft.com/en-us/library/dz4y9b9a(VS.80).aspx

himitsu 29. Dez 2009 09:25

Re: OffsetOf Delphi ekvivalent?
 
Delphi-Quellcode:
var x: record
         a: word;
         b: longword;
       end;

offset := Integer(@x.b) - Integer(@x);
// or
offset := Integer(@x.b) - Integer(@x.a);
found in http://www.delphipraxis.net/internal...ghlight=align* :angel2:

nanix 29. Dez 2009 09:38

Re: OffsetOf Delphi ekvivalent?
 
in my case its a bit diffrent..


Delphi-Quellcode:
var
length:DWORD;

 length:=OffsetOf(record, member.CharData) +  sizeof(member.CharData);

himitsu 29. Dez 2009 09:52

Re: OffsetOf Delphi ekvivalent?
 
Code:
#define offsetof(struct_type, member) \
          (size_t) &(((struct_type *)0)->member)
This would presumably it look something like this in Delphi.
Delphi-Quellcode:
function OffsetOf(StructType: Type; Member: string): Integer;
  type P = ^StructType;

  begin
    //Result := Integer(@P(nil)^.[Member]) - Integer(@P(nil)^);
    //Result := Integer(@P(nil)^.[Member]) - Integer(P(nil));
    //Result := Integer(@P(nil)^.[Member]) - 0;
    Result := Integer(@P(nil)^.[Member]);
  end;
My code would look something like this.
Delphi-Quellcode:
function OffsetOf(StructType: Type; Member: string): Integer;
  var X: StructType;

  begin
    Result := Integer(@X.[Member]) - Integer(@X);
  end;
But Delphi does not support macros.

Zitat:

Zitat von nanix
Code:
length = OffsetOf(member, CharData) +  sizeof(member->CharData);

Delphi-Quellcode:
length := Integer(@PMember(nil).CharData) + SizeOf(TMember.CharData);

Elvis 29. Dez 2009 11:49

Re: OffsetOf Delphi ekvivalent?
 
Himitsu, dein Code ist leider ein bissel dolle falsch. Denn Pointer sind nicht Integer, sondern Cardinal.
Anwendungen, die diese Annahme machen (Pointer=Integer), sind die ersten, die auf einem Windows explodieren, das "alten" 32Bit Apps mehr als 2GB Addressraum gibt.

@Nanix, I am pretty sure you can _read_ German just fine. In any other case, posting in German forum might be a bit moot to begin with, hmm?

himitsu 29. Dez 2009 12:03

Re: OffsetOf Delphi ekvivalent?
 
@Elvis: Integer oder Cardinal ist hier egal, da nach der Subtraktion eh keine Werte über 2 GB groß sein werden.
(Addition und Subtraktion wird bei Integer und Cardinal gleich behandelt)

Zumindestens habe ich noch keinen Record gesehn, welcher über 2 GB groß ist. :roll:

nanix 29. Dez 2009 12:20

Re: OffsetOf Delphi ekvivalent?
 
I can only understand read but not write german. :)

Elvis 29. Dez 2009 19:09

Re: OffsetOf Delphi ekvivalent?
 
Zitat:

Zitat von himitsu
@Elvis: Integer oder Cardinal ist hier egal, da nach der Subtraktion eh keine Werte über 2 GB groß sein werden.
...
Zumindestens habe ich noch keinen Record gesehn, welcher über 2 GB groß ist. :roll:

Jo, das war wohl etwas kleinkariert.
Aber um beim Karo zu bleiben könnte ein record 2GB überschreiten. Natürlich würde die App, dann nur auf einem Win2003 oder Win64 laufen. Aber 32Bit Apps können halt mehr als 2GB adressieren und deshalb sollte man sich angewöhnen (vorzeichenbehaftete) Integer und Pointer nicht gleich zu benutzen.


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