![]() |
Windows API - Parameterübergabe klappt nicht
Hallo!
Ich bin grad dabei, eine Klassenbibliothek zu übersetzen. Komme nicht weiter. Bei der API Funktion Windows.GetKeyBoardState bleibt der Compiler stehen. Folgende Fehlermeldung: [Fehler] gdikeys.inc(301): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen. Wenn ich aber @State schreibe statt State, bricht der Compiler mit der gleichen Fehlermeldung ab. Was ist da los? Gibt es bei der Verwendung des Windows API Faustregeln, mit denen man solche Probleme umschiffen kann. Eine wenigstens fast immer funktionierende Datendefinition. Die integrierte Hilfe sagt mir, das als Rückgabetyp für State ein Pointer gefordert ist. (ein lpKeyState vom Typ PByte) Habe während der Übersetzung mehrere solche Stellen gehabt und werde vermutlich noch weitere finden, bevor alles übersetzt ist. Dieser Quelltext hier steht beispielhaft für die Problematik
Delphi-Quellcode:
Wer kann mir hier helfen? Gibt es für das WinAPI einen richtig sicheren Weg, solche Parameterprobleme zu umschiffen???
function GetKeyboardShiftState: TShiftState;
type PKeyState = ^TKeyState; //Auch mit dieser Defi TKeyState = array[0..255] of byte; var State: PKeyState; //State: array[byte] of byte; //Das war die Originale Definition begin Windows.GetKeyboardState(State); //Hier kommt der Compiler nicht weiter -> WARUM NICHT????? //Auch mi8t der originalen Definition von State kommt der Compiler hier nicht weiter!!! //Deshalb habe ich einen TKeyState/TKeyState-Typ definiert, in der Hoffnung, das der Compiler //das schluckt. Klappt aber nicht Result := []; if (State[VK_SHIFT] and 128) <> 0 then Include(Result, ssShift); if (State[VK_MENU] and 128) <> 0 then Include(Result, ssAlt); if (State[VK_CONTROL] and 128) <> 0 then Include(Result, ssCtrl); if (State[VK_LBUTTON] and 128) <> 0 then Include(Result, ssLeft); if (State[VK_RBUTTON] and 128) <> 0 then Include(Result, ssRight); if (State[VK_MBUTTON] and 128) <> 0 then Include(Result, ssMiddle); if (State[VK_CAPITAL] and 1) <> 0 then Include(Result, ssCaps); if (State[VK_NUMLOCK] and 1) <> 0 then Include(Result, ssNum); if (State[VK_SCROLL] and 1) <> 0 then Include(Result, ssScroll); end; ein verzweifelter schöni |
Re: Windows API - Parameterübergabe klappt nicht
Was machst du denn da für Verrenkungen?
Delphi-Quellcode:
Pointer in API Funktionen werden in der Regel mit var-Parametern in Delphi übersetzt.
procedure TForm1.Button1Click(Sender: TObject);
var State: TKeyboardState; begin GetKeyBoardState(State); |
Re: Windows API - Parameterübergabe klappt nicht
Hallo Luckie!
Danke. Mit Typ TKeyboardState klappt die Übersetzung problemlos. schöni |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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