Einzelnen Beitrag anzeigen

Benutzerbild von GimbaR
GimbaR

Registriert seit: 17. Apr 2004
Ort: Weltmetropole Rostock ;)
134 Beiträge
 
Delphi 2006 Professional
 
#1

[Indy] TIdTCPServer in einer DLL verwenden?!

  Alt 30. Sep 2005, 01:24
Moin,
ich versuche gerade ein Plugin für Winamp5 zu schreiben, dass es ermöglicht Winamp über das netzwerk "fernzusteuern". Ich weiß, dass es derartige Plug-ins schon gibt, trotzdem möchte ich -der Erfahrung halber- mein eigenes Plug-in schreiben. Mein erster Gedanke war die Indy-kompos zu verwenden...
Kleiner test mit zwei ganz normalen anwendung: Das senden von Strings zwischen zwei PCs klappte auf anhieb tadellos. Nun habe ich versucht den "Server" in eine DLL zu verfrachten, doch leider bekomme ich die Fehlermeldung
Zitat:
[Fehler] gen_remamp.dpr(86): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
in der zeile
IdTCPServer1.OnExecute:= IdTCPServer1Execute; zum besseren verständniss poste ichmal den gesamten source der libary:

Delphi-Quellcode:
library gen_remamp;

{$R *.res}

uses
  Windows, SysUtils, Forms, IdBaseComponent, IdComponent, IdTCPServer;

type
  PGeneralPlugin = ^TGeneralPlugin;
  TGeneralPlugin = record
    Version: Integer;
    Description: PChar;
    InitProc: procedure; cdecl;
    ConfigProc: procedure; cdecl;
    QuitProc: procedure; cdecl;
    hwndParent: THandle;
    DllInstance: THandle;
  end;

var
  PluginInfo: TGeneralPlugin;
  HookHandle: Cardinal = 0;
  hWinAmp: HWnd;
  IdTCPServer1: TIdTCPServer;

const
  WM_USER = $0400;
  WM_WA_IPC = $0400;
  WM_COMMAND = $0111;
  IPC_PLAYFILE = 100;
  IPC_STARTPLAY = 102;
  IPC_SETPLAYLISTPOS = 121;
  IPC_GetListPos = 125;
  IPC_GetPlaylistFile = 211;
  IPC_UPDTITLE = 243;
  IPC_PlayButton = 40045;

procedure IdTCPServer1Execute(AThread: TIdPeerThread);
begin
  MessageBox(0, '', PChar(AThread.Connection.ReadLn), MB_OK);
end;

procedure InitPlugin; cdecl
var
  position: Integer;
begin
  {//Start
  position:= 1;
  SendMessage(hWinAmp,WM_WA_IPC,position,IPC_SETPLAYLISTPOS);
  SendMessage(hWinAmp,WM_WA_IPC,0,IPC_PLAYFILE);
  //SendMessage(hWinAmp,WM_WA_IPC,0,IPC_UPDTITLE);
  //SendMessage(hWinAmp,WM_WA_IPC,0,IPC_STARTPLAY);}

  // Test des Indy-Clients
end;

procedure ConfigPlugin; cdecl
begin
    MessageBox(0, 'RemoteAmp - Control WinAmp via TCP/IP'     + #13 +
                                                                #13 +
                  'coded by GimbaR'                           + #13 +
                  'RemAmp - 09/05', mb_ok);
end;

procedure QuitPlugin; cdecl;
begin
  //Disconcect
end;

function GetPluginInfo: PGeneralPlugin;
begin
  with PluginInfo do
    begin
      Version:= $10;
      Description:='RemAmp - remote WinAmp [TCP/IP] - by GimbaR';
      InitProc:= InitPlugin;
      ConfigProc:= ConfigPlugin;
      QuitProc:= QuitPlugin;
      hwndParent:= 0;
      DllInstance:= hInstance;
    end;
  result:= @PluginInfo;
  hWinAmp:= FindWindow('Winamp v1.x', nil);
  // Einstellungen des Indy-Servers setzen
  IdTCPServer1:= TIdTCPServer.Create(Application);
  IdTCPServer1.DefaultPort:= 35600;
  IdTCPServer1.OnExecute:= IdTCPServer1Execute; //<-- hier tritt der Fehler auf
end;


exports
  GetPluginInfo name 'winampGetGeneralPurposePlugin';

end.
Eigentlich dachte ich dass ich die Procedure "IdTCPServer1Execute" direkt auf das Ereigniss "OnExecute" von "IdTCPServer1" könnte, aber leider kommt halt die fehlermeldung
Weiß jemand rat? Was muss ich beachten? Was soll ich ändern? Ist das überhaupt möglich?
^^

so far

GimbaR
Jonas
Bei dem Tempo ist es nur noch eine Frage der Zeit bis SSchäuble verlangt allen deutschen Bürgern ein Halsband zur ständigen Überwachung zu verpassen...
  Mit Zitat antworten Zitat