AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Net Send Mailslot selbst verarbeiten!
Thema durchsuchen
Ansicht
Themen-Optionen

Net Send Mailslot selbst verarbeiten!

Ein Thema von J Kadison · begonnen am 25. Aug 2009 · letzter Beitrag vom 2. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
J Kadison

Registriert seit: 8. Sep 2007
Ort: Ebertsheim
96 Beiträge
 
Delphi 7 Personal
 
#1

Net Send Mailslot selbst verarbeiten!

  Alt 25. Aug 2009, 21:12
Hallo!

Ich wollte ein Programm haben, welches sich hinter NetSend legt (oder evtl dieses deaktivert und ersetzt) um die einkommenden Nachrichten abzufangen. Im moment fange ich diese sehr unschön mit einem Timer ab und lese das aktuelle Handle aus.

Wirklich unschön

Jetz habe ich gesehen, windows schickt dies an sogenannte Mailslots.
Diese kann ich ja auch selbst erstellen. ?!

so weit ich das jetzt herausgefunden habe, benötige ich folgenden Mailslot:

'\\.\mailslot\messngr'

So!

erstellen tu ich diesen hiermit:
Delphi-Quellcode:
Procedure TMailSlot.CreateMailSlot;
var
  aPath : PCHAR;
Begin
  aPath := '\\.\mailslot\messngr';
  fHandle := CreateMailslotA(aPath, 0, MAILSLOT_WAIT_FOREVER, nil);
End;

(Stimmt das bis jetzt noch oder gibt es eine bessere/richtigere Lösung?)


So! Mein Problem ist jetzt allerdings,

Wie rufe ich denn jetzt die Informationen ab, ob etwas angekommen ist?


Habe hierzu folgenden QT gefunden:

Delphi-Quellcode:
procedure TMailSlot.Execute;
Var
  aSize : cardinal;
  fMaxLength: cardinal;
begin
  While Not Terminated Do
  Begin
    SetLength (fMessage, fMaxLength); // fMessage ist ein privates String-Feld...
    if ReadFile(fHandle, PChar(fMessage)^, fMaxLength, aSize, nil) Then
    Begin
      If not terminated Then
      Begin
       SetLength (fMessage, aSize);
      End
    End
  end;
end;
Wobei aber 2 Probleme aufgetuacht sind:
1. Es funktioniert nicht . . .
2. Wieso: "readfile" ist dieser Mailslot ne datei??? wie funktioniert das denn genau?

Kann mir da bitte jemand helfen?


Wäre echt super
Liebe Grüße
joshi
MFG
Joshi
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Net Send Mailslot selbst verarbeiten!

  Alt 25. Aug 2009, 22:08
Mit Mailsolts habe ich auch noch nicht gearbeitet. Aber ja, Mailslots werden von Windows wie Dateien behandelt, das stimmt schon.

Aber was heißt "funktioniert nicht"? Da musst du schon mal selber etwas debuggen und rausfinden, was nicht funktioniert, damit wir dir helfen können.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
J Kadison

Registriert seit: 8. Sep 2007
Ort: Ebertsheim
96 Beiträge
 
Delphi 7 Personal
 
#3

Re: Net Send Mailslot selbst verarbeiten!

  Alt 26. Aug 2009, 05:38
Ähm ja, was heißt selbst debuggn? ^^

es ist einfach das Problem, dass

if ReadFile(fHandle, PChar(fMessage)^, fMaxLength, aSize, nil) IMMER false ist ...

obwohl was angekommen ist
MFG
Joshi
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Net Send Mailslot selbst verarbeiten!

  Alt 26. Aug 2009, 06:56
Hier mal eine uralte Unit von mir, die Mails mit einer bekannten maximalen Länge verschicken kann:
Instanziiere einen TMailReceiver in den Anwendungen, die Mails empfangen sollen und weise das den 'SlotName' sowie das OnMailReceived-Ereignis zu. Starte den Receiver mit 'Start', beende ihn mit 'Stop'.

Verschicke eine Mail an einen Computer mit 'SendMail'. Wenn Du als Computernamen '*' angibst, wird die Mail an alle Rechner verschickt.

Die Unit ist gefühlte 79 Jahre alt und stammt noch aus den Anfängen meiner Delphi-Zeit. Ich würde mich freuen, wenn Jemand diese Unit auf Vordermann bringt und verbessert.

Delphi-Quellcode:
unit csMail;

interface
uses Classes;
Type
  TMailReceiveEvent = Procedure (Sender : TObject; aMessage : TStrings) of Object;
  TMailReceiver = Class (TThread)
  private
    fMaxLength : Integer;
    fHandle : THandle;
    fOnMail : TMailReceiveEvent;
    fMessage : String;
    fSlotName: String;
    procedure DoOnMailReceived;
  Protected
    Procedure Execute; Override;
  Public
    Constructor Create (aSlotName : String; aMaxLength : Integer);
    Destructor Destroy; Override;
    Procedure Start;
    Procedure Stop;
    Property OnMailReceived : TMailReceiveEvent Read fOnMail Write fOnMail;
    Property SlotName : String Read fSlotName;
    End;

Procedure SendMail (aComputer, aSlotName, aMessage : String);
Function CsGetComputerName:String;

implementation
uses windows, SysUtils;

Function CsGetComputerName:String;
var
  le: DWORD;

begin
   le:=63;
   SetLength(result,le);
   if GetComputerName(PChar(result),le) then
     SetLength(result, le)
   else
     result:= '??';
End;

///////////////////////////////////////////////////////////////////////////////
// SendMail: Send a Mail 'aMessage' to the Mailslot 'aSlotName' on the //
// Machine 'aComputer' //
///////////////////////////////////////////////////////////////////////////////
Procedure SendMail (aComputer, aSlotName, aMessage : String);
var
  Bytes: DWord;
  aPath : String;
  aHandle : THandle;

begin
  aPath := '\\' + aComputer + '\mailslot\' + aSlotName;
  aHandle := CreateFile(PChar(aPath), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  try
    if aHandle = INVALID_HANDLE_VALUE then
      Raise EInOutError.CreateFmt('Cannot create mailslot %s\%s',[aComputer,aSlotName])
    else
      If not WriteFile(aHandle, Pointer(aMessage)^, Length(aMessage), Bytes, nil)
        Then Raise EInOutError.CreateFmt('Cannot write to mailslot %s\%s',[aComputer,aSlotName]);
  finally
    if aHandle <> INVALID_HANDLE_VALUE Then
      CloseHandle(aHandle);
    end;
end;

{ TMailReceiver }

///////////////////////////////////////////////////////////////////////////////
// Object : TMailReceiver //
///////////////////////////////////////////////////////////////////////////////
constructor TMailReceiver.Create(aSlotName : String; aMaxLength : Integer);
Var
  aPath : String;

begin
  Inherited Create (True);
  fSlotName := aSlotName;
  fMaxLength := aMaxLength;
  aPath := '\\.\mailslot\' + aSlotName;
  fHandle := CreateMailSlot(PChar(aPath), 0, MAILSLOT_WAIT_FOREVER, nil);
end;

destructor TMailReceiver.Destroy;
begin
  Terminate;
  CloseHandle (fHandle);
end;

procedure TMailReceiver.DoOnMailReceived;
Var
  s : TStringList;

begin
  if Assigned (fOnMail) And (Length (fMessage)>0 ) Then begin
    s := TStringList.Create;
    Try
      s.Text := fMessage;
      fOnMail (Self, s);
    Finally
      s.free
      end
    End;
end;

procedure TMailReceiver.Execute;
Var
  aSize : DWord;

begin
  While Not Terminated Do Begin
    SetLength (fMessage, fMaxLength);
    if ReadFile(fHandle, PChar(fMessage)^, fMaxLength, aSize, nil) Then
      If not terminated Then
        SetLength (fMessage, aSize);
    if not terminated then
      Synchronize (DoOnMailReceived);
    End
end;

procedure TMailReceiver.Start;
begin
  Resume;
end;

procedure TMailReceiver.Stop;
begin
  Try
    Terminate;
    SetMailslotInfo (fHandle,0);
  Except
    End;
end;

end.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
J Kadison

Registriert seit: 8. Sep 2007
Ort: Ebertsheim
96 Beiträge
 
Delphi 7 Personal
 
#5

Re: Net Send Mailslot selbst verarbeiten!

  Alt 27. Aug 2009, 18:31
Öhm, also Ich hab das ganze jetzt mal versucht auszuprobieren, aber bei mir klappt das nicht.

Also ich hab jetzt ner variablen den folgendes zugewiesen: TMailReceiver.Create('messngr', 255);
dann habe ich dem Event TMailReceiveEvent eine Prozedur zugewiesen und meine Var.start ausgeführt.


Das Problem ist allerdings, ich kann nichts senden, und wenn ich von einem Anderen PC net send ausführe bekomme ich einen Fehler
Ich habe das gefühl der Slot wurde nicht erstellt.

was mach ich denn falsch?
MFG
Joshi
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Net Send Mailslot selbst verarbeiten!

  Alt 27. Aug 2009, 20:45
Zitat von J Kadison:
was mach ich denn falsch?
Du nennst uns den Fehler nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
J Kadison

Registriert seit: 8. Sep 2007
Ort: Ebertsheim
96 Beiträge
 
Delphi 7 Personal
 
#7

Re: Net Send Mailslot selbst verarbeiten!

  Alt 28. Aug 2009, 05:24
Eine Fehlermeldung bekomme ich in Delphi / bzw in meinem Programm NICHT.

Allerdings wenn ich von einem Anderen PC mit net send eine Nachricht verschicken will, bekomme ich einen "Netzwerkfehler".
Also genau den Fehler, wie wenn "Net Send" deaktiviert ist.

Sollte es ja aber nichtmehr sein, da ich dies doch ersetzen will und davor deswegen schon den Mailslot messngr erstellt habe.
Zumindest gab es keine Fehlermeldung beim erstellen.


Gibt es einen Befehl für die CMD oder so um alle Mailslots anzuzeigen? das wäre schonmal sehr hilfreich


Ah was mir grad so einfällt, als ich NetSend noch aktiv hatte bekam ich bei dem OnRecieve ereignis alle paar millisekunden folgendes geliefert:
"TButton|| "
also die || sind nicht darstellbare zeichen.


Wieso kommt der denn da zum Vorschein?
MFG
Joshi
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: Net Send Mailslot selbst verarbeiten!

  Alt 28. Aug 2009, 06:05
Sieht mir fast nach einem Buffer Overflow oder einer falschen Zeigeradresse aus ..
  Mit Zitat antworten Zitat
Benutzerbild von hitzi
hitzi

Registriert seit: 2. Jan 2003
Ort: Eibau
768 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Net Send Mailslot selbst verarbeiten!

  Alt 28. Aug 2009, 06:36
Wenn du den Mailslot "\\.\mailslot\messngr" nutzen willst, musst du vorher überprüfen ob der Nachrichtendienst (Dienstname: Messenger) läuft und den entsprechend beenden. Wenn der dieser Dienst läuft hat er den Mailslot schon geöffnet und du kommst nicht mehr dran.
Thomas
Besucht doch mal http://www.hitziger.net
  Mit Zitat antworten Zitat
J Kadison

Registriert seit: 8. Sep 2007
Ort: Ebertsheim
96 Beiträge
 
Delphi 7 Personal
 
#10

Re: Net Send Mailslot selbst verarbeiten!

  Alt 28. Aug 2009, 08:54
Wie oben schon erwähnt habe ich diesen Dienst zuvor schon gestoppt. Und dann erst den slot erstellt =(



Zitat:
Sieht mir fast nach einem Buffer Overflow oder einer falschen Zeigeradresse aus ..
Und wie verhinder ich diesen? =)
MFG
Joshi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:06 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