Seite 1 von 2

Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 00:19
von pureanfänger
Hallo Leute,

ich habe eine Verständnissfrage.

Ist es möglich, Daten zwischen zwei Programmen auszutauschen, ohne eine extra Datei dafür anzulegen ?

Beispiel:

Programm 1 setzt einen Zähler auf "1" und Programm zwei ließt diesen aus und reagiert darauf.

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 00:37
von HeX0R
Klar.

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 00:52
von STARGÅTE
Wenn du selbst beide Programme (aus sich heraus) startest:
EnvironmentVariable

Wenn beide Programme nicht aus sich heraus gestartet wurden:
SharedMemory

Wenn beide Programme nicht auf dem selben PC gestartet wurden:
Network

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 01:35
von pureanfänger
Vielen Dank.

Ich habe gestern die Hilfe durchsucht aber den Befehl habe ich irgendwie übersehen :)

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 08:10
von DarkDragon
Eine weitere offizielle Methode sind "Named Pipes".

http://www.purebasic.fr/german/viewtopi ... 05#p241805

Unter Linux lautet der Befehl zur Erstellung so einer Pipe mkfifo_.

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 08:18
von RSBasic
Oder per #WM_COPYDATA...

1. Anwendung:

Code: Alles auswählen

EnableExplicit

Global MyMessage.l = RegisterWindowMessage_("MyOwnMessage")

Procedure WindowCallback(WindowID,message,wParam,lParam)
  Protected result
  Protected *cd.COPYDATASTRUCT
  
  result = #PB_ProcessPureBasicEvents
  Select message
    Case #WM_COPYDATA
      If wParam=1
        *cd = lParam
        AddGadgetItem(1,-1,PeekS(*cd\lpData),0,0)
        ProcedureReturn #True
      EndIf
      
  EndSelect
  ProcedureReturn result
EndProcedure

If OpenWindow(0,0,0,500,250,"ProgrammXYZ",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(1,10,10,480,230,0)
  
  SetWindowCallback(@WindowCallback())
  
Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndIf
2. Anwendung:

Code: Alles auswählen

EnableExplicit

Define handle
Define Message.s
Global MyMessage.l = RegisterWindowMessage_("MyOwnMessage")
Define cd.COPYDATASTRUCT

handle=FindWindow_(#Null,"ProgrammXYZ")
If handle
  
  Message.s="Hallo, dies ist eine Nachricht, die gesendet wurde."
  cd\dwData = 0
  cd\cbData = (Len(Message) + 1) * SizeOf(Character)
  cd\lpData = @Message
  
  SendMessage_(handle,#WM_COPYDATA,1,cd)
Else
  MessageRequester("","Programm nicht gefunden.",0)
EndIf

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 08:44
von DarkDragon
Oder über die geheime Zwischenablage (eher als Scherz anzusehen, würde allerdings mit einem Feedback auf der Empfängerseite auch funktionieren):

Code: Alles auswählen

Define CrypticalFormat.i
Define Memory.i
Define Text.s

CrypticalFormat = RegisterClipboardFormat_("WAIODJIWOADJWIOIAJISDJ")
If CrypticalFormat <> 0
  If OpenClipboard_(0)
    ; Read it if something is available
    Memory = GetClipboardData_(CrypticalFormat)
    If Memory <> 0
      Debug PeekS(GlobalLock_(Memory))
      GlobalUnlock_(Memory)
      SetClipboardData_(CrypticalFormat, 0)
    Else
      ; or write it if nothing is in the clipboard
      Text = "Hello, World!"
      Memory = GlobalAlloc_(#GMEM_MOVEABLE, StringByteLength(Text, #PB_Ascii))
      If Memory <> 0
        PokeS(GlobalLock_(Memory), Text, -1, #PB_Ascii)
        GlobalUnlock_(Memory)
        
        Debug "Writing data to clipboard."
        
        SetClipboardData_(CrypticalFormat, Memory)
      EndIf
    EndIf
    CloseClipboard_()
  EndIf
EndIf

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 14:55
von NicTheQuick
Hat niemand Lust das alles in die FAQ zu schreiben? <)

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 14:59
von ts-soft

Re: Kommunikation zwischen zwei Programmen?

Verfasst: 23.03.2011 16:16
von TomS
DarkDragon, deinen Code würde ich nicht verwenden.
Ich denke mal er erzeugt einen neuen Typen neben den 3 bekannten Standardtypen, Text, Data/Image und File.
Allerdings können diese 3 Typen nicht parallel benutzt werden.
Das heißt, wenn du einen Bildschnipsel aus Paint ausgeschnitten/kopiert hast und danach einen Text kopierst, ist der Bildschnipsel weg.
Wenn jetzt konstant im Hintergrund irgendwelcher für den Anwender unrelevanter Quatsch meine Text Schnipsel überschreibt, würde mich das sehr ärgern.