Einzelnen Beitrag anzeigen

schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#1

Windows API - Parameterübergabe klappt nicht

  Alt 20. Okt 2005, 10:42
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
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat