![]() |
Net Send Mailslot selbst verarbeiten!
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:
Wobei aber 2 Probleme aufgetuacht sind:
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; 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 |
Re: Net Send Mailslot selbst verarbeiten!
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. |
Re: Net Send Mailslot selbst verarbeiten!
Ähm ja, was heißt selbst debuggn? ^^
es ist einfach das Problem, dass
Delphi-Quellcode:
IMMER false ist ...
if ReadFile(fHandle, PChar(fMessage)^, fMaxLength, aSize, nil)
obwohl was angekommen ist :| |
Re: Net Send Mailslot selbst verarbeiten!
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. |
Re: Net Send Mailslot selbst verarbeiten!
Ö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? |
Re: Net Send Mailslot selbst verarbeiten!
Zitat:
|
Re: Net Send Mailslot selbst verarbeiten!
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? |
Re: Net Send Mailslot selbst verarbeiten!
Sieht mir fast nach einem Buffer Overflow oder einer falschen Zeigeradresse aus ..
|
Re: Net Send Mailslot selbst verarbeiten!
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.
|
Re: Net Send Mailslot selbst verarbeiten!
Wie oben schon erwähnt habe ich diesen Dienst zuvor schon gestoppt. Und dann erst den slot erstellt =(
Zitat:
|
Re: Net Send Mailslot selbst verarbeiten!
Zitat:
Ich hatte das mal in der Art genutzt (gekürzt):
Delphi-Quellcode:
fMailSlot := CreateMailSlot('\\.\mailslot\messngr', 0, 0, nil); [...] iMsgSize : DWord; iRead : DWord; sMsg : string; //wird mit Unicode Delphi Probleme machen [...] if GetMailslotInfo(fMailslot, nil, iMsgSize, nil,nil) then begin if iMsgSize <> MAILSLOT_NO_MESSAGE then begin SetLength(sMsg, iMsgSize); if ReadFile(fMailslot, sMsg[1], iMsgSize, iRead, nil) then begin //in sMsg stehen alle Infos getrennt durch #0 end; end; end; |
Re: Net Send Mailslot selbst verarbeiten!
Guck mal hier: http://assarbad.net/en/stuff/!export/ gerade gefunden.
|
Re: Net Send Mailslot selbst verarbeiten!
Zitat:
Vielleicht erwartet das 'Net Send' noch etwas anderes |
Re: Net Send Mailslot selbst verarbeiten!
Hallo!
Also ich habe jetzt mal ein bisschen weiter getüftelt. Habe jetzt eine funktionierende Sende- und Empfang-Routine in Meinem Programm welche auf einen X-Beliebigen Slot gelegt werden können. Funktioniert superschnell. Allerdings folgendes Problem: Deaktiviere ich meinen "Nachrichtendienst" und lege mein Programm auf "MESSNGR" scheint dies ersteinmal zu funktionieren (über meine Senderoutine). Sende ich allerdings von einem anderen PC per "Net Send" bekomme ich folgenden Fehler:
Code:
./> net send TestUmgebung "MailSlotTest"
Beim Senden einer Nachricht an TestUmgebung trat ein Fehler auf. Allgemeiner Netzwerkfehler aufgetreten. Sie erhalten weitere Hilfe, wenn Sie NET HELPMSG 2136 eingeben. Zitat:
Bei aktiviertem net send geht der Befehl einwandfrei durch. Was könnte dieser Nachrichtendienst noch tun, was ich nicht mache? |
Re: Net Send Mailslot selbst verarbeiten!
Zitat:
|
Re: Net Send Mailslot selbst verarbeiten!
Zitat:
Hihi! der war gut ^^ Als Ob microsoft hier ne fehlermeldung bringen würde, die einem weiter bringt ^^
Code:
Auf gut deutsch, "der programmierer hatte selbst keine Ahnung, welchen Fehler er hier grad behandelt ?!
.\>NET HELPMSG 2136
Allgemeiner Netzwerkfehler aufgetreten. ERLÄUTERUNG Ein allgemeiner Fehler in der Netzwerkhardware ist aufgetreten. Ursache dieses P roblems kann ein Hardwarekonflikt sein, der durch verschiedene Serverbefehle and erer Server hervorgerufen wurde (z.B. Verzeichnisreplikationsdienst). AKTION Wenden Sie sich an den Netzwerkadministrator. Die Ursache des Problems kann in d er installierten Hardware oder Software des Computers liegen. KAnn ich mir so einen netzwerkadministrator leasen damit der das behebt? xD Ne, mal ernst, kann damit jemand was anfangen? |
Re: Net Send Mailslot selbst verarbeiten!
Hallo? Keiner eine Ahung?
Jemand ne idee, wo ich mich da noch erkundigen könnte? Ich habe nichts passendes gefunden. Wäre auch shcon dankbar für hinweise . . . Kann es vielleicht sein, dass ich mein Programm als Dienst 'Nachrichtendienst' bzw 'messenger' einrichten muss? Könnte das funktioniueren? wenn ja wie geht sowas denn? Hab jetzt noch ein bisschen Herumgeforscht . . . und zwar: 1. was komisch ist, ich habe mal Ports mit netstat überprüft und mir ist aufgefallen, dass sowohl bei eingeschaltetem dienst wie auch ausgeschaltet die Ports TCP und UDP 137-139 und 445 auf ABHÖREN stehen. Ist dies normal? sollten die nicht beim ausschalten geschlossen werden? Kann der Fehler vielleicht darin liegen, dass ich portmäßig hier noch was machen muss?
Code:
Falls Das relevant sein könnte . . .
Nachrichtendienst wird beendet.........
Nachrichtendienst wurde erfolgreich beendet. C:\Dokumente und Einstellungen\Joshua>netstat -nao Aktive Verbindungen Proto Lokale Adresse Remoteadresse Status PID TCP 0.0.0.0:135 0.0.0.0:0 ABHÖREN 1056 TCP 0.0.0.0:443 0.0.0.0:0 ABHÖREN 892 TCP 0.0.0.0:445 0.0.0.0:0 ABHÖREN 4 TCP 192.168.2.102:139 0.0.0.0:0 ABHÖREN 4 TCP 192.168.2.102:139 192.168.2.100:4051 SCHLIESSEN_WARTEN 4 TCP 192.168.2.102:139 192.168.2.100:4052 SCHLIESSEN_WARTEN 4 TCP 192.168.56.1:139 0.0.0.0:0 ABHÖREN 4 UDP 0.0.0.0:445 *:* 4 UDP 0.0.0.0:500 *:* 488 UDP 192.168.2.102:137 *:* 4 UDP 192.168.2.102:138 *:* 4 UDP 192.168.56.1:137 *:* 4 UDP 192.168.56.1:138 *:* 4 C:\Dokumente und Einstellungen\Joshua>net start nachrichtendienst Nachrichtendienst wird gestartet...... Nachrichtendienst wurde erfolgreich gestartet. C:\Dokumente und Einstellungen\Joshua>netstat -nao Aktive Verbindungen Proto Lokale Adresse Remoteadresse Status PID TCP 0.0.0.0:135 0.0.0.0:0 ABHÖREN 1056 TCP 0.0.0.0:443 0.0.0.0:0 ABHÖREN 892 TCP 0.0.0.0:445 0.0.0.0:0 ABHÖREN 4 TCP 192.168.2.102:139 0.0.0.0:0 ABHÖREN 4 TCP 192.168.2.102:139 192.168.2.100:4051 SCHLIESSEN_WARTEN 4 TCP 192.168.2.102:139 192.168.2.100:4052 SCHLIESSEN_WARTEN 4 TCP 192.168.56.1:139 0.0.0.0:0 ABHÖREN 4 UDP 0.0.0.0:445 *:* 4 UDP 0.0.0.0:500 *:* 488 UDP 192.168.2.102:137 *:* 4 UDP 192.168.2.102:138 *:* 4 UDP 192.168.56.1:137 *:* 4 UDP 192.168.56.1:138 *:* 4 Hat jetzt vielleciht jemand eine Idee? |
Re: Net Send Mailslot selbst verarbeiten!
Hi Joshi,
Mailslot unterhält sich per Port UDP 137, wenn dir das weiterhilft! Du kannst da auch Nachrichten an Programme direkt adressieren oder allgemein, aber das weisst du ja ;) gruß, bucksbunny |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 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