Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi THandle und WinAPI unter XE2 (https://www.delphipraxis.net/169603-thandle-und-winapi-unter-xe2.html)

H4ndy 31. Jul 2012 10:56

Delphi-Version: XE2

THandle und WinAPI unter XE2
 
Hallo,

Ich versuche mich gerade auf Arbeit an der Umstellung unseres Projektes von Delphi 2010 auf XE2.
Einige Hürden konnte ich schon nehmen (z.B. das die alten IFDEFs nicht mehr gehen), jedoch bin ich etwas skeptisch bei THandle.

THandle wird bei uns recht oft genutzt, vorallem bei Aufrufen von WinAPI-Funktionen (z.B. BeginThread, etc.).
Jetzt habe ich das Problem, dass THandle unter XE2 ein NativeUInt ist, was unter 32Bit einem Cardinal entspricht.

WinAPI-Aufrufe wollen für Handles aber immer einen Cardinal haben, jetzt knallt es natürlich beim Compile mit
einem "[DCC Error] E2033 Types of actual and formal var parameters must be identical".

Gibt es da eine elegantere Möglichkeit als alle THandles auf Cardinal umzustellen? Übersehe ich was?
64-Bit ist aktuell nicht geplant, alles bleibt erstmal auf 32Bit Windows als Zielplatform.

mkinzler 31. Jul 2012 11:11

AW: THandle und WinAPI unter XE2
 
Zitat:

(z.B. das die alten IFDEFs nicht mehr gehen)
Inwiefern?
Zitat:

Jetzt habe ich das Problem, dass THandle unter XE2 ein NativeUInt ist, was unter 32Bit einem Cardinal entspricht.
Ist ja auch richtig so, da THandle von der Platform (x32/x64) abhängt.
WinAPI funktionen sollten die Paraemter trotzdem akzeptieren

Delphi-Quellcode:
var
   msg: NativeUInt;
begin
    PostMessage( 0, msg, 1, 2);
end;
funktioniert z.B. auch wenn der Parameter msg ein Cardinal erwartet

Zitat:

64-Bit ist aktuell nicht geplant, alles bleibt erstmal auf 32Bit Windows als Zielplatform.
Aktuell ist die Krux. Besser jetzt so machen, dass es unter x64 auch funktionieren könnte.

H4ndy 31. Jul 2012 12:01

AW: THandle und WinAPI unter XE2
 
Zitat:

Zitat von mkinzler (Beitrag 1176431)
Inwiefern?

Wird ein internes Problem sein worauf ich bei uns gestoßen bin. Es werden diverse Defines gesetzt wie z.B. DELPHI4, DELPHI6, etc. die man für Verzweigungen nutzten kann. Da bin ich jetzt aber am Aufräumen, da eh nur noch Delphi 2010 oder neuer noch unterstützt wird.

Zitat:

Zitat von mkinzler (Beitrag 1176431)
Ist ja auch richtig so, da THandle von der Platform (x32/x64) abhängt.
WinAPI funktionen sollten die Paraemter trotzdem akzeptieren

Delphi-Quellcode:
var
   msg: NativeUInt;
begin
    PostMessage( 0, msg, 1, 2);
end;
funktioniert z.B. auch wenn der Parameter msg ein Cardinal erwartet

Dein Code funktioniert bei mir auch, aber z.B. folgender nicht:
Delphi-Quellcode:
var
  FThreadID: THandle;
  FHandle: THandle;
begin
  FHandle := BeginThread(nil, 0, nil, Pointer(Self), CREATE_SUSPENDED, FThreadID);
end;
Damit dieser geht, muss ich FThreadID auf Cardinal oder TThreadID (LongWord) setzen. THandle oder NativeUInt verweigert der Compiler.

Oder der hier (verlangt ebenfalls Cardinal):
Delphi-Quellcode:
var
  Size, FixInfoLen: DWORD;
  Handle: THandle;
begin
  Size := GetFileVersionInfoSize(PWideChar(Application.ExeName), Handle);
Zitat:

Zitat von mkinzler (Beitrag 1176431)
Aktuell ist die Krux. Besser jetzt so machen, dass es unter x64 auch funktionieren könnte.

Wir arbeiten dran.
Aber bei über 1 Million Zeilen Code einer mittlerweile 14 Jahre gereiften Software leider nicht immer ganz einfach (bei der Migration auf Delphi 2010 wurde da aber schon sehr viel verbessert oder ausgetauscht).

TiGü 31. Jul 2012 13:41

AW: THandle und WinAPI unter XE2
 
In der Regel sollte man wirklich die Datentypen verwenden, die die (Windows-)funktionen brauchen, selbst wenn sie nur ein Alias für Basistypen sind.
Denn kaum wird untenrum gerührt, schon gehts im eigenen Programm nicht.

Auch wenn die Codevervollständigung einen was von Cardinal erzählen will, stimmt das nicht immer!

Einzig saubere Lösung ist das Umstellen auf die richtigen Datentypen.
Delphi-Quellcode:
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
  ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
  var ThreadId: TThreadID): Integer;

function GetFileVersionInfoSize(lptstrFilename: PWideChar; var lpdwHandle: DWORD): DWORD; stdcall;

H4ndy 31. Jul 2012 13:49

AW: THandle und WinAPI unter XE2
 
Zitat:

Zitat von TiGü (Beitrag 1176465)
Einzig saubere Lösung ist das Umstellen auf die richtigen Datentypen.

Hmm muss ich wohl immer in der MSDN nachschauen wenn mich da selbst CodeInsight über den Datentyp anlügt (bzw es aus dem Var-Namen ableiten).

Danke für die hilfreichen Antworten.

TiGü 31. Jul 2012 14:41

AW: THandle und WinAPI unter XE2
 
Zitat:

Zitat von H4ndy (Beitrag 1176466)
Hmm muss ich wohl immer in der MSDN nachschauen wenn mich da selbst CodeInsight über den Datentyp anlügt (bzw es aus dem Var-Namen ableiten).

Obacht, das passt auch nicht immer, da die Funktionen in der Windows.pas teilweise anderes gewrappt sind.
Am Beispiel für GetFileInfoSize sieht man es:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Es gibt zwar in Delphi den Datentyp LPDWORD, aber dann ist es trotzdem nicht der richtige Datentyp für diese Funktion.

H4ndy 31. Jul 2012 14:43

AW: THandle und WinAPI unter XE2
 
Danke für die Info.

Zitat:

Zitat von Dr. House
Everybody Lies.



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