Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy] TIdTCPServer in einer DLL verwenden?! (https://www.delphipraxis.net/54228-%5Bindy%5D-tidtcpserver-einer-dll-verwenden.html)

GimbaR 30. Sep 2005 00:24


[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:

[Fehler] gen_remamp.dpr(86): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
in der zeile
Delphi-Quellcode:
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

marabu 30. Sep 2005 06:40

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

GimbaR 30. Sep 2005 08:59

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

marabu 30. Sep 2005 09:11

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

GimbaR 30. Sep 2005 09:47

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 diese Vorlage

daraufhin habe ich das daraus gemacht:
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;
  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.
Doch leider kommt an der stelle
Delphi-Quellcode:
TCPServer1:= TIdTCPServer.Create(Application);
die Fehlermeldung
Zitat:

Der linken Seite kann nichts zugewiesen werden
Wenn ich jetzt diese Zeile auskommentiere, wird zwar alles fehlerfrei compiliert, jedoch wird dann kein der TCPServer1 erstellt. :(

marabu 30. Sep 2005 09:56

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

GimbaR 30. Sep 2005 10:04

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