Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Windows API - Parameterübergabe klappt nicht (https://www.delphipraxis.net/55388-windows-api-parameteruebergabe-klappt-nicht.html)

schöni 20. Okt 2005 09:42


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:
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;
Wer kann mir hier helfen? Gibt es für das WinAPI einen richtig sicheren Weg, solche Parameterprobleme zu umschiffen???

ein verzweifelter

schöni

Luckie 20. Okt 2005 09:49

Re: Windows API - Parameterübergabe klappt nicht
 
Was machst du denn da für Verrenkungen?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  State: TKeyboardState;
begin
  GetKeyBoardState(State);
Pointer in API Funktionen werden in der Regel mit var-Parametern in Delphi übersetzt.

schöni 20. Okt 2005 10:38

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 13:05 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