![]() |
[Indy] TIdTCPServer in einer DLL verwenden?!
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:
Delphi-Quellcode:
zum besseren verständniss poste ichmal den gesamten source der libary:
IdTCPServer1.OnExecute:= IdTCPServer1Execute;
Delphi-Quellcode:
Eigentlich dachte ich dass ich die Procedure "IdTCPServer1Execute" direkt auf das Ereigniss "OnExecute" von "IdTCPServer1" könnte, aber leider kommt halt die fehlermeldung :(
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. Weiß jemand rat? Was muss ich beachten? Was soll ich ändern? Ist das überhaupt möglich? ^^ so far GimbaR |
Re: [Indy] TIdTCPServer in einer DLL verwenden?!
Hi GimbaR,
die Fehlermeldung ist eindeutig: du kannst der property OnExecute keine reguläre procedure als event handler zuweisen - es muss schon eine procedure of object sein, also eine Methode. Grüße vom marabu |
Re: [Indy] TIdTCPServer in einer DLL verwenden?!
Erstmal danke für die Antwort, doch leider kann ich damit nichts anfangen, bzw ich weiß nicht genau, was du meinst :(
Könntets du mir ein beispiel geben, wie ich die procedure zu einer Methode mache? so far GimbaR |
Re: [Indy] TIdTCPServer in einer DLL verwenden?!
Eine Möglichkeit wäre, dass du einen type TGimbarServer = class(TidTCPServer) ableitest, diesem deine Prozedur als private procedure ExecuteHandler zuordnest und im constructor gleich die Zuweisung OnExecute := ExecuteHandler vornimmst.
marabu |
Re: [Indy] TIdTCPServer in einer DLL verwenden?!
So, hab das mal jetzt so versucht umzusetzen wie ich es verstanden hab.
Vorlage für mich war ![]() daraufhin habe ich das daraus gemacht:
Delphi-Quellcode:
Doch leider kommt an der stelle
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; TCPServer1 = class(TIdTCPServer) private procedure TCPServer1Execute(AThread: TIdPeerThread); public constructor CreateServer; end; var PluginInfo: TGeneralPlugin; HookHandle: Cardinal = 0; hWinAmp: HWnd; 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; constructor TCPServer1.CreateServer; begin //inherited Create; OnExecute:= TCPServer1Execute; Bindings:= nil; CommandHandlers:= nil; Greeting.NumericCode:= 0; MaxConnectionReply.NumericCode:= 0; DefaultPort:= 35600; //Active:= true; end; procedure TCPServer1.TCPServer1Execute(AThread: TIdPeerThread); begin MessageBox(0, PChar(AThread.Connection.ReadLn), 'Test', 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', '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 TCPServer1:= TIdTCPServer.Create(Application); //<-- hier end; exports GetPluginInfo name 'winampGetGeneralPurposePlugin'; end.
Delphi-Quellcode:
die Fehlermeldung
TCPServer1:= TIdTCPServer.Create(Application);
Zitat:
|
Re: [Indy] TIdTCPServer in einer DLL verwenden?!
Du hast den bisherigen Variablen-Bezeichner TCPServer1 jetzt für eine Klasse verwendet. Du brauchst aber schon noch eine Variable, der du eine Instanz deiner neuen Klasse zuweisen kannst.
marabu |
Re: [Indy] TIdTCPServer in einer DLL verwenden?!
:oops: :oops: :oops:
k, soweit wird alles compiliert, jedoch bekomme ich nen Runtime Error, wenn ich WinAmp starte, aber das ist ein anderes Problem... So weit vielen Dank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 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