![]() |
INVALID_HANDLE_VALUE Delphi XE4 32/64bit
Hallo,
folgendes Beispiel:
Delphi-Quellcode:
Wenn ich das als 32bit compiliere ist alles gut.
procedure TForm4.FormCreate(Sender: TObject);
const Handles = 2; var Return : LongWord; HandleBuffer : Array[0..1] of THandle; begin Return := MsgWaitForMultipleObjects (Handles, HandleBuffer, False, 2000, QS_ALLINPUT); case Return of INVALID_HANDLE_VALUE : begin Sleep(0); end; end; end; Wenn ich das als 64bit compiliere, bekomme ich eine Warnung, dass der untere Konstantenausdruck verletzt wird. INVALID_HANDLE_VALUE scheint einen unterschiedlichen Wert bei 32/64bit zu haben. Was kann man an dieser Stelle machen? MsgWaitForMultipleObjects liefert ja egal ob 32/64 bit immer ein DWord (LongWord) zurück! Gruß |
AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
Schau dir doch an wie INVALID_HANDLE_VALUE definiert ist.
Oft ist sowas wie
Delphi-Quellcode:
zu finden.
INVALID_HANDLE_VALUE = -1;
|
AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
Es ist leider so, daß die Windows-API an vielen Stellen nicht typsicher ist. Da wird ein z.B. Parameter als unsigned deklariert, in der Dokumentation steht dann aber, daß bei einem Wert von -1 dies oder jenes passiert. Als ordentlicher Delphi-Programmierer schüttelt man da nur noch den Kopf.
|
AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
Und genau das ist auch bei einem Handle der Fall, so wie es aussieht: In Delphi ist der Wert für INVALID_HANDLE_VALUE als -1 deklariert. Handles sind unsigned, also ergibt das die höchstmögliche Zahl. Ich habe noch nichts auf 64 Bit kompiliert, aber im Nachhinein wundere ich mich jetzt auch, warum auf 32 Bit keine Warnung kommt...
Nur: Du nimmst als Datentyp LongWord. LongWord ist Cardinal. Cardinal ist immer 32 Bit. Ich würde NativeUInt als Typ nehmen... Nur: Was willst du eigentlich mit INVALID_HANDLE_VALUE? Das gibt die Funktion doch garnicht her. Sie gibt ein DWORD zurück. Handles sind NativeUInt. Schau doch nochmal ![]() |
AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
INVALID_HANDLE_VALUE ist hier schlicht falsch der Dokumentation nach...
Dieser Wert entspricht zwar im Speicher WAIT_FAILED, da -1 so dargestellt wird wie WAIT_FAILED als DWORD 0xFFFFFFFF, aber falsch ist es hier dennoch, da die Dokumentation nur WAIT_FAILED als möglichen Rückgabewert angibt... |
AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
In Delphi 2009 war INVALID_HANDLE_VALUE aber noch als DWord(-1) deklariert, deswegen habe ich das früher auch abgefragt, weil es die Funktion auch wiedergeben konnte!
Mich interessiert ja nur, wie man das dann unter XE4 machen soll/te Gruß |
AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
Na die MSDN-Beschreibung ist doch gut genug um da die möglichen Return-Values zu erkennen. Ob nun 32-bit oder 64-bit ist doch egal:
![]() |
AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 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