Kommunikation zwischen zwei Programmen?

Anfängerfragen zum Programmieren mit PureBasic.
pureanfänger
Beiträge: 74
Registriert: 29.03.2008 15:22

Kommunikation zwischen zwei Programmen?

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Kommunikation zwischen zwei Programmen?

Beitrag von HeX0R »

Klar.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Kommunikation zwischen zwei Programmen?

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
pureanfänger
Beiträge: 74
Registriert: 29.03.2008 15:22

Re: Kommunikation zwischen zwei Programmen?

Beitrag von pureanfänger »

Vielen Dank.

Ich habe gestern die Hilfe durchsucht aber den Befehl habe ich irgendwie übersehen :)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Kommunikation zwischen zwei Programmen?

Beitrag 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_.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Kommunikation zwischen zwei Programmen?

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Kommunikation zwischen zwei Programmen?

Beitrag 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
Zuletzt geändert von DarkDragon am 23.03.2011 18:14, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Kommunikation zwischen zwei Programmen?

Beitrag von NicTheQuick »

Hat niemand Lust das alles in die FAQ zu schreiben? <)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Kommunikation zwischen zwei Programmen?

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: Kommunikation zwischen zwei Programmen?

Beitrag 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.
Antworten