Seite 1 von 1

MailSlot - Nachrichten im Netzwerk verschicken

Verfasst: 19.03.2006 20:59
von mk-soft
Wenn mal Net Send vom Admin gesperrt ist, hier ein kleines Beispielprogramm zum senden von Nachrichten.
Habe ich noch nicht mit mehreren Rechnern getestet.

Code: Alles auswählen

;-Top
; Kommentar    : MailSlot
; Author       : mk-soft
; Erstellt am  : 18.03.2006
; Geändert am  : 08.08.2006

Global *buffer
*buffer = AllocateMemory(2048)

; ---------------------------------------------------------

Procedure.l MakeSlot(Name.s)
  
  ProcedureReturn CreateMailslot_("\\.\mailslot\" + Name, 2048, #MAILSLOT_WAIT_FOREVER, #Null)
  
EndProcedure

; ---------------------------------------------------------

Procedure ReadSlot(hSlot.l)

  result = GetMailslotInfo_(hSlot, @lpMaxMessageSize, @lpNextSize.l, @lpMessageCount.l, 0)
  If result <> 0
    If lpNextSize >= 0
      ReadFile_(hSlot, *buffer, lpNextSize, @lpNumberOfBytesRead, 0)
      AddGadgetItem(0, -1, PeekS(*buffer,lpNumberOfBytesRead))
    EndIf
  EndIf
  
EndProcedure

; ---------------------------------------------------------

Procedure WriteSlot(Von.s, Text.s)

  Name.s = StringField(text, 1, " ")
  Send.s = Von + ": " + Right(text, Len(text) - Len(name) - 1)
  
  If OpenFile(0, "\\*\mailslot\" + Name)
    WriteString(0, Send)
    CloseFile(0)
  EndIf

EndProcedure

; ---------------------------------------------------------

handle = 0

Name.s = InputRequester("Startup MailSlot", "Dein Name", "Name")
If Name = ""
  End
EndIf

If OpenWindow(0,20,20,300,200,"MailSlot - " + Name)

  CreateGadgetList(WindowID(0))
    ListViewGadget(0, 0, 0, 300, 170) 
    StringGadget(1, 4, 172, 290, 24, "Name Nachricht")
    
  handle = MakeSlot(Name)
  If handle = #INVALID_HANDLE_VALUE    
    Debug "Fehler beim anlegen von Mail Slot"
    End
  EndIf

  AddKeyboardShortcut(0, #PB_Shortcut_Return, 13)
  SetActiveGadget(1)
  
  exit = 0
  Repeat
    event = WindowEvent()
    gadget = EventGadget()
    type = EventType()
    menu = EventMenu()
     
    ReadSlot(handle)
    
    Select event
      
      Case #PB_Event_CloseWindow
        CloseHandle_(handle)
        exit = 1
      
      Case #PB_Event_Menu         
        If menu = 13
          WriteSlot(Name, GetGadgetText(1))
          SetGadgetText(1, "")
        EndIf
         
      Case 0
        Delay(10)
      
    EndSelect
    
  Until exit
  
EndIf
FF :allright:

Update PB4
- Name im Fenstertitel

Verfasst: 19.03.2006 21:30
von Kyoko12
Hi <)

Also wenn ich das Ausführen will, kommen Massenweiße Fehler?? Ist das Code für PB 4??

mfg,
Maximilian Mayerl

Verfasst: 19.03.2006 21:32
von Macros
Kurzer Blick:

Code: Alles auswählen

gadget = EventGadget()
JA, ist es.

Verfasst: 19.03.2006 21:36
von ts-soft
Das WindowEvent() vielleicht tauschen gegen:WaitWindowEvent(10)
und Delay entfernen.
Das Arbeitet laut Aussage von Freak Systemkonformer.

Verfasst: 19.03.2006 21:52
von Macros
Code für 3.94, Bug korrigiert:

Code: Alles auswählen

;-Top
; Kommentar    : MailSlot
; Author       : mk-soft
; Erstellt am  : 18.03.2006
; Geändert am  :

Global *buffer
*buffer = AllocateMemory(2048)

; ---------------------------------------------------------

Procedure.l MakeSlot(Name.s)
 
  ProcedureReturn CreateMailslot_("\\.\mailslot\" + Name, 2048, #MAILSLOT_WAIT_FOREVER, #Null)
 
EndProcedure

; ---------------------------------------------------------

Procedure ReadSlot(hSlot.l)

  result = GetMailslotInfo_(hSlot, @lpMaxMessageSize, @lpNextSize.l, @lpMessageCount.l, 0)
  If result <> 0
    If lpNextSize >= 0
    PokeS(*buffer,Space(1023),1024)
      ReadFile_(hSlot, *buffer, lpNextSize, @lpNumberOfBytesRead, 0)
      AddGadgetItem(0, -1, PeekS(*buffer))
    EndIf
  EndIf
 
EndProcedure

; ---------------------------------------------------------

Procedure WriteSlot(Von.s, Text.s)

  Name.s = StringField(text, 1, " ")
  Send.s = Von + ": " + Right(text, Len(text) - Len(name) - 1)
 
  If OpenFile(0, "\\*\mailslot\" + Name)
    WriteString( Send)
    CloseFile(0)
  EndIf

EndProcedure

; ---------------------------------------------------------

handle = 0

Name.s = InputRequester("Startup MailSlot", "Dein Name", "Name")
If Name = ""
  End
EndIf
Name.s=ReplaceString(name.s," ","_")

If OpenWindow(0,20,20,300,200,#PB_Window_SystemMenu,"MailSlot")

  CreateGadgetList(WindowID(0))
    ListViewGadget(0, 0, 0, 300, 170)
    StringGadget(1, 4, 172, 290, 24, "Name Nachricht")
   
  handle = MakeSlot(Name)
  If handle = #INVALID_HANDLE_VALUE   
    Debug "Fehler beim anlegen von Mail Slot"
    End
  EndIf

  AddKeyboardShortcut(0, #PB_Shortcut_Return, 13)
  ActivateGadget(1)
 
  exit = 0
  Repeat
    event = WindowEvent()
    gadget = EventGadgetID()
    type = EventType()
    menu = EventMenuID()
     
    ReadSlot(handle)
   
    Select event
     
      Case #PB_Event_CloseWindow
        CloseHandle_(handle)
        exit = 1
     
      Case #PB_Event_Menu         
        If menu = 13
          WriteSlot(Name, GetGadgetText(1))
          SetGadgetText(1, "")
        EndIf
         
      Case 0
        Delay(10)
     
    EndSelect
   
  Until exit
 
EndIf
Der Bug ist, das du den Nachrichtenbuffer nicht löscht, was zu folgenden führt:

macros: Und Klappt es?
****: Ja, es funktioniert
macros:gut Klappt es?
***:Was meinstetioniert

Verfasst: 19.03.2006 22:56
von mk-soft
Noch ein kleinen Nachtrag zu WriteSlot()

"\\.\mailslot\name" Retrieves a client handle to a local mailslot.
"\\computername\mailslot\name" Retrieves a client handle to a remote mailslot.
"\\domainname\mailslot\name" Retrieves a client handle to all mailslots with the specified name in the specified domain.
"\\*\mailslot\name" Retrieves a client handle to all mailslots with the specified name in the system's primary domain.

Verfasst: 19.03.2006 23:12
von Macros
Meinen Beitrag gelesen?
Du hast einen Fehler.

Verfasst: 19.03.2006 23:52
von mk-soft
Meinst du Poke(*buffer, ...) was du eingefügt hast.

Das habe ich gelesen und eingeflegt

?? :|