Ich nutze den IOW als Plugin für mein Media Cetner.
Mittels DLL Callback wird der Befehl an das Main Programm übergeben.
Drücke ich einmal zu lange auf die Fernbedienung so wird das Callback mehrmals aufgerufen.
Am schlimmsten ist das Problem wenn ich versuche per Fernbedienung das Media Center zu beenden, er ruft vor dem Close immernoch mindestens einmal die Procedure auf. Dies macht das Beenden pratisch unmöglich.
Schalte ich allerdings alle Plugins vorher ab, so hängt immernoch mindestens einmal der Procedureaufruf im Speicher und hängt sich dann dort mit einer AV weg.
Übergabe der DLL
FSendData ist vom Typ: TPluginReceiveData = function(MCP_Index: Integer; Command: Integer): Boolean; stdcall;
Code: Select all
procedure ReadData(Address, Command: Byte);
var
I: Integer;
begin
if Assigned(FSendData) then begin
for I := Low(IRCommandList) to High(IRCommandList) do begin
if IRCommandList[I].IRCommand = InttoStr(Command) then begin
IOW_Controller.DataReceived := nil; // Übergabe nil setzen
if FSendData(Self_Index, IRCommandList[I].Command) then; // Befehl übergeben
IOW_Controller.DataReceived := ReadData; // Übergabe wieder aktivieren
end;
end;
end;
end;
Code: Select all
function ReceiveData_(MCP_Index: Integer; Command: Integer): Boolean; stdcall;
begin
Main_Frm.ReceiveData(MCP_Index, Command);
Result := False;
end;
begin
case Command of
CMD_MENU: ;
CMD_MUTE: ;
CMD_VOLUP: ;
CMD_VOLDOWN: ;
CMD_UP: Self.FMC_Menu.ButtonActive := Self.FMC_Menu.ButtonActive -1;
CMD_DOWN: Self.FMC_Menu.ButtonActive := Self.FMC_Menu.ButtonActive +1;
CMD_LEFT: ;
CMD_RIGHT: ;
CMD_PLAY: ;
CMD_STOP: ;
CMD_NEXT: ;
CMD_PREV: ;
CMD_0: ;
CMD_1: ;
CMD_2: ;
CMD_3: ;
CMD_4: ;
CMD_5: ;
CMD_6: ;
CMD_7: ;
CMD_8: ;
CMD_9: ;
CMD_TOGLESCREEN: ;
CMD_MODE_AUDIO: ;
CMD_MODE_VIDEO: ;
CMD_SELECT: Self.SelectPressed;
end;
end;
Gruß
dsn