![]() |
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. |
AW: THandle und WinAPI unter XE2
Zitat:
Zitat:
WinAPI funktionen sollten die Paraemter trotzdem akzeptieren
Delphi-Quellcode:
funktioniert z.B. auch wenn der Parameter msg ein Cardinal erwartet
var
msg: NativeUInt; begin PostMessage( 0, msg, 1, 2); end; Zitat:
|
AW: THandle und WinAPI unter XE2
Zitat:
Zitat:
Delphi-Quellcode:
Damit dieser geht, muss ich FThreadID auf Cardinal oder TThreadID (LongWord) setzen. THandle oder NativeUInt verweigert der Compiler.
var
FThreadID: THandle; FHandle: THandle; begin FHandle := BeginThread(nil, 0, nil, Pointer(Self), CREATE_SUSPENDED, FThreadID); end; Oder der hier (verlangt ebenfalls Cardinal):
Delphi-Quellcode:
var
Size, FixInfoLen: DWORD; Handle: THandle; begin Size := GetFileVersionInfoSize(PWideChar(Application.ExeName), Handle); Zitat:
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). |
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; |
AW: THandle und WinAPI unter XE2
Zitat:
Danke für die hilfreichen Antworten. |
AW: THandle und WinAPI unter XE2
Zitat:
Am Beispiel für GetFileInfoSize sieht man es: ![]() Es gibt zwar in Delphi den Datentyp LPDWORD, aber dann ist es trotzdem nicht der richtige Datentyp für diese Funktion. |
AW: THandle und WinAPI unter XE2
Danke für die Info.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:09 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