AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi [Indy] TIdTCPServer in einer DLL verwenden?!
Thema durchsuchen
Ansicht
Themen-Optionen

[Indy] TIdTCPServer in einer DLL verwenden?!

Ein Thema von GimbaR · begonnen am 30. Sep 2005 · letzter Beitrag vom 30. Sep 2005
Antwort Antwort
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, 00: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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: [Indy] TIdTCPServer in einer DLL verwenden?!

  Alt 30. Sep 2005, 06:40
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
  Mit Zitat antworten Zitat
Benutzerbild von GimbaR
GimbaR

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

Re: [Indy] TIdTCPServer in einer DLL verwenden?!

  Alt 30. Sep 2005, 08:59
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
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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: [Indy] TIdTCPServer in einer DLL verwenden?!

  Alt 30. Sep 2005, 09:11
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
  Mit Zitat antworten Zitat
Benutzerbild von GimbaR
GimbaR

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

Re: [Indy] TIdTCPServer in einer DLL verwenden?!

  Alt 30. Sep 2005, 09:47
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
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.
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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: [Indy] TIdTCPServer in einer DLL verwenden?!

  Alt 30. Sep 2005, 09:56
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
  Mit Zitat antworten Zitat
Benutzerbild von GimbaR
GimbaR

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

Re: [Indy] TIdTCPServer in einer DLL verwenden?!

  Alt 30. Sep 2005, 10:04


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
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz