Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi INVALID_HANDLE_VALUE Delphi XE4 32/64bit (https://www.delphipraxis.net/175503-invalid_handle_value-delphi-xe4-32-64bit.html)

Alex_ITA01 26. Jun 2013 13:40

INVALID_HANDLE_VALUE Delphi XE4 32/64bit
 
Hallo,
folgendes Beispiel:

Delphi-Quellcode:
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 32bit compiliere ist alles gut.
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ß

Bernhard Geyer 26. Jun 2013 13:43

AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
 
Schau dir doch an wie INVALID_HANDLE_VALUE definiert ist.

Oft ist sowas wie

Delphi-Quellcode:
INVALID_HANDLE_VALUE = -1;
zu finden.

Uwe Raabe 26. Jun 2013 13:55

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.

Der schöne Günther 26. Jun 2013 13:59

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 in die Doku - Die Funktion gibt überhaupt kein Handle zurück!

jaenicke 26. Jun 2013 14:08

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...

Alex_ITA01 26. Jun 2013 14:23

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ß

baumina 26. Jun 2013 14:42

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:

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

jaenicke 26. Jun 2013 14:58

AW: INVALID_HANDLE_VALUE Delphi XE4 32/64bit
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1219797)
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!

Nur weil es rein zufällig der selbe Wert ist wie für WAIT_FAILED heißt das ja nicht, dass es richtig war eine Konstante zu benutzen, die mit dieser API Funktion gar nichts zu tun hat.

Zitat:

Zitat von Alex_ITA01 (Beitrag 1219797)
Mich interessiert ja nur, wie man das dann unter XE4 machen soll/te

Genauso wie vorher auch, mit der richtigen Konstante. Und das ist nun einmal wie in der Dokumentation zu lesen ist und wie ich schon geschrieben habe WAIT_FAILED, das (laut Dokumentation korrekt) als DWORD($FFFFFFFF) definiert ist.


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