[gelöst] GetWindowText - SIGSEGV bei 64Bit

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

[gelöst] GetWindowText - SIGSEGV bei 64Bit

Beitrag von TerribleCode »

Hallo Leute,

ich möchte unter Windows den Titel eines Fensters verarbeiten. Dazu verwende ich GetWindowText(). Alles kein Problem, solange die Anwendung in 32Bit kompliert wird. Tue ich dasselbe in einer 64Bit Anwendung, dann bekomme ich immer einen SIGSEGV. GetLastError() teilt mir mit, dass der Handle ungültig ist (Code 1400).
Ich habe eine ganze Weile gebraucht, bis ich das Problem auf die Bitbreite zurückführen konnte... Oder bin ich da auf dem Holzweg?
Nun ist die Frage, wie kann ich den Handle so anpassen, dass er in die Windows API passt?
Das Fensterhandle manuell von HWND auf LongInt oder Int32 umzustellen hilft leider nicht...


Danke für eure Hilfe,
liebe Grüße.


Weitere Daten:
OS: Windows 7 - AMD64
Lazarus 1.6, FPC 3.0.0


Beispielcode:

Code: Alles auswählen

uses
  ... windows ...
 
procedure TForm1.Button1Click(Sender: TObject);
var
  wHandle: HWND;
  wCaption: LPWSTR;
begin
  wCaption:=AllocCaption;
  wHandle:=GetForegroundWindow;
  GetWindowTextW(wHandle, wCaption, 250);
end;
Zuletzt geändert von TerribleCode am Mi 12. Okt 2016, 20:44, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10861
Registriert: Mo 11. Sep 2006, 19:01

Re: GetWindowText - SIGSEGV bei 64Bit

Beitrag von theo »

HWND ist ziemlich sicher nicht das Problem, da HWND bzw. THandle automatisch QWord wird auf 64 bit.
Was AllocCaption macht, lässt du allerdings im Dunkeln.

Benutzeravatar
theo
Beiträge: 10861
Registriert: Mo 11. Sep 2006, 19:01

Re: GetWindowText - SIGSEGV bei 64Bit

Beitrag von theo »

Probier mal sowas, geht das auch nicht?

Code: Alles auswählen

var wHandle:hwnd;
ws:  WideString;
len: integer;
begin
 wHandle:=GetForegroundWindow;
 len:=GetWindowTextLength(wHandle);
 SetLength(ws,len);
 GetWindowTextW(wHandle,@ws[1],len+1);

TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

AllocCaption Erklärung und Frage zu @ws[1]

Beitrag von TerribleCode »

Hey Theo,

Mensch... Da habe ich mir ja echt was zusammen gereimt von wegen Bitbreite und so :oops:

AllocCaption ist einfach nur ein String, der 251 Zeichen enthält... Ich dachte, damit wäre es getan...
Aber offenbar lag genau da mein Problem, denn dein Code funktioniert!

Warum schreibst du hinter @ws eigentlich noch [1]? Was bewirkt das? Zeigst du damit nicht auf das zweite Zeichen in dem String?

Viele Dank für deine Hilfe!
LG

GetWindowTextLength habe ich übrigens mal in die WideString Version (GetWindowTextLengthW) geändert...

Benutzeravatar
theo
Beiträge: 10861
Registriert: Mo 11. Sep 2006, 19:01

Re: AllocCaption Erklärung und Frage zu @ws[1]

Beitrag von theo »

TerribleCode hat geschrieben:Warum schreibst du hinter @ws eigentlich noch [1]? Was bewirkt das? Zeigst du damit nicht auf das zweite Zeichen in dem String?
Dort fängt der Textinhalt an. Bei [0] wäre die Längenangabe des Strings gespeichert. Wir reden von einem Pointer.
Schreib einfach mal 0 hin, dann siehst du schon, dass der Compiler meckert.

http://wiki.freepascal.org/Character_an ... WideString

TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

Eine Frage hätte ich noch...

Beitrag von TerribleCode »

Aha guter Tipp, learning by doing...
Ich hätte noch eine Verständnisfrage:
Sehe ich das richtig, dass du das +1 bei len nur für das abschließende NullByte machst, das die API anfügt? (Was ja getrost ignoriert werden kann...)

Antworten