AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

THandle und WinAPI unter XE2

Ein Thema von H4ndy · begonnen am 31. Jul 2012 · letzter Beitrag vom 31. Jul 2012
Antwort Antwort
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#1

THandle und WinAPI unter XE2

  Alt 31. Jul 2012, 11:56
Delphi-Version: 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.
Manuel
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: THandle und WinAPI unter XE2

  Alt 31. Jul 2012, 12:11
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#3

AW: THandle und WinAPI unter XE2

  Alt 31. Jul 2012, 13:01
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.

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);
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).
Manuel
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: THandle und WinAPI unter XE2

  Alt 31. Jul 2012, 14:41
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;
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#5

AW: THandle und WinAPI unter XE2

  Alt 31. Jul 2012, 14:49
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.
Manuel
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: THandle und WinAPI unter XE2

  Alt 31. Jul 2012, 15:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#7

AW: THandle und WinAPI unter XE2

  Alt 31. Jul 2012, 15:43
Danke für die Info.

Zitat von Dr. House:
Everybody Lies.
Manuel
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 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