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 Prüfen, ob PChar einen Ordinalwert enthält? (https://www.delphipraxis.net/179245-pruefen-ob-pchar-einen-ordinalwert-enthaelt.html)

Zacherl 22. Feb 2014 14:07

Prüfen, ob PChar einen Ordinalwert enthält?
 
Hallo zusammen,

gibt es eine Standard-Vorhergehensweise, um zu prüfen, ob ein P(Ansi)Char Wert als Ordinalwert gebraucht wird? GetProcAddress erlaubt ja beispielsweise PAnsiChar Werte in dieser Form zu [strike]miss[/strike]ge-brauchen. Auch Resourcen können auf diesem Wege adressiert werden.

Folgendes habe ich öfters mal gefunden:
Delphi-Quellcode:
IsOrdinal := (NativeUInt(PCharValue) shr 16) = 0;
Hier wird impliziert, dass der PChar nur bei Verwendung von mehr als 16 Bits einen validen Pointer enthalten kann.

Kann man das so nehmen, oder gibt es hier eventuell irgendeine Art von Vorgabe von MS selbst?

Viele Grüße
Zacherl

jaenicke 22. Feb 2014 21:43

AW: Prüfen, ob PChar einen Ordinalwert enthält?
 
Warum sollte man denn einen Ordinalwert darin speichern?

Aber ja, das ist dokumentiert. Du kannst den niedrigsten Wert mit GetSystemInfo auslesen:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Damit erhältst du unter anderem lpMinimumApplicationAddress. Und das ist normalerweise zumindest bei 32 Bit Systemen $00010000, woher auch der von dir genannte Test rührt. Du könntest auch den Systemwert abfragen und schauen, ob dein Wert niedriger ist.

Zacherl 24. Feb 2014 00:01

AW: Prüfen, ob PChar einen Ordinalwert enthält?
 
Wunderbar danke dir! Auf die Idee lpMinimumApplicationAddress aus der SystemInfo Struct zu prüfen, bin ich noch gar nicht gekommen.

Ich selbst will keinen Ordinalwert als PChar speichern, muss aber überprüfen, ob ich an diversen Stellen Ordinalwerte übergeben bekomme. Im EnumResources Callback war das beispielsweise notwendig.

BUG 24. Feb 2014 00:38

AW: Prüfen, ob PChar einen Ordinalwert enthält?
 
Wenn nicht etwas sehr verrücktes abgeht, sollte es niemals valide Pointer unter 2^12 = 4096 geben. Die erste Page wird vom OS vernünftigerweise auf invalid gesetzt, damit man einen Pagefault erhält, wenn man einen Nullpointer dereferenziert. Hurra für Null-Pointer-Exceptions :mrgreen:

Zitat:

Zitat von Zacherl (Beitrag 1249240)
Im EnumResources Callback war das beispielsweise notwendig.

Man kann sich auch die Beschreibung von IS_INTRESOURCE angegucken.
Da es ein Macro ist, wird sich der Wert vermutlich auch nicht so schnell ändern.

Zacherl 24. Feb 2014 00:59

AW: Prüfen, ob PChar einen Ordinalwert enthält?
 
Zitat:

Zitat von BUG (Beitrag 1249246)
Man kann sich auch die Beschreibung von IS_INTRESOURCE angegucken.
Da es ein Macro ist, wird sich der Wert vermutlich auch nicht so schnell ändern.

Danke! Ich wusste, dass es da irgendwo ein Macro gibt, aber mir war leider der name entfallen :-D Der Beschreibung nach sollten 16 Bit dann wohl auch ausreichen.


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