| |
|
|
- Seite 1 - |
|
Julian Schmidt | Hallo, ich suche Beispiel zur Kommunikation zwischen zwei XProfan-Programmen.
Zum einen bräuchte ich ein Beispiel, womit man aus einen laufenden XProfan-Programm ein anderes XProfan-Programm mit verschiedenen Parametern aufruft, welches die Parameter auffängt und weiterverarbeitet.
Zum zweiten ein Beispiel, womit man aus einen laufenden XProfan-Programm Strings an ein anderes laufendes XProfan-Programm senden kann, welche dann verarbeitet werden. Beim zweiten Beispiel sollten die Strings eindeutig nur an das eine Programm gesendet werden können. Sprich keine Dopplungen mit anderen Fenstern möglich sein, wie es etwa bei FindWindow der Fall ist.
LG
Julian57 |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Jörg Sellmeyer | Sieh mal in der Hilfe unter "Multiprozessing mit XProfan" nach. |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 15.03.2012 ▲ |
|
|
|
|
Julian Schmidt | Wow, da scheint es ja schon gut Möglichkeiten zu geben.
Dennoch fände ich es gut, wenn mal jemand einen Quelltext zur Eins verfasst. |
|
|
| |
|
|
|
Andreas Miethe
| OK, hier mal ein kleines Beispiel :
Der Server liest einen String vom Client und ändert ihn.
Client bitte zuerst starten
'CLIENT
'Client
$H windows.ph
Var IsActive& = 0
Var InMemory& = 4000
Var Ende& = 0
'1024 Bytes Speicher
Var SizeOfMem& = 1024
'Speicherbereich anlegen
Var hmap& = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,SizeOfMem&,"MeinSpeicher")
'Zeiger auf Speicherbereich ermitteln
Var hMapView& = ~MapViewOfFile(hMap&,$000F001F, 0, 0, 0)
'Damit ist der Speicherbereich angelegt
Cls
'die ersten 4 Bytes erhalten das Fensterhandle
Long hMapView&,0 = %hwnd
'die nächsten 4 Bytes bleiben frei für das Fensterhandle von Programm 2
'ich frage aber ab, ob Programm2 schon läuft
If Long(hMapView&,4) <> 0' wenn der Wert gefüllt ist, dann läuft Programm2
IsActive& = 1
else
'mit ShellExecute() kann ich Programm2 hier von Hand starten
Endif
String hMapView&,8 = "String von Programm1"+Chr$(0)'Strings immer mit einem Nullbyte abschliessen
'Ist Programm2 aktiv, schicke ich die Meldung, das sich etwas im Speicher befindet
If IsActive&
SendMessage(Long(hMapView&,4),InMemory&,0,0)
Endif
'vom Programm wird eine Meldung zurückkommen
UserMessages InMemory&
whilenot Ende&
Waitinput
If %UMessage = InMemory&
Locate 0,0
Print String$(hMapview&,8)
Endif
EndWhile
~UnmapViewOfFile(hMapView&)
~CloseHandle(hMapView&)
End
'SERVER
'Server
$H windows.ph
Var IsActive& = 0
Var InMemory& = 4000
Var Ende& = 0
'1024 Bytes Speicher
Var SizeOfMem& = 1024
'Speicherbereich anlegen
Var hmap& = ~CreateFileMapping(-1,0,~PAGE_READWRITE,0,SizeOfMem&,"MeinSpeicher")
'Zeiger auf Speicherbereich ermitteln
Var hMapView& = ~MapViewOfFile(hMap&,$000F001F, 0, 0, 0)
'Damit ist der Speicherbereich angelegt
Cls
'die zweiten 4 Bytes erhalten das Fensterhandle
Long hMapView&,4 = %hwnd
Print String$(hMapView&,8)
String hMapView&,8 = "Programm 2 : Habe den String gelesen und geändert"+Chr$(0)'Strings immer mit einem Nullbyte abschliessen
SendMessage(Long(hMapView&,0),InMemory&,0,0)
UserMessages InMemory&
whilenot Ende&
Waitinput
If %UMessage = InMemory&
Locate 0,0
Print String$(hMapview&,8)
Endif
EndWhile
~UnmapViewOfFile(hMapView&)
~CloseHandle(hMapView&)
End
|
|
|
| Gruss Andreas ________ ________ ________ ________ _ Profan 3.3 - XProfanX2 Win 95,98,ME,2000,XP,Vista - Win 7 32 / 64 Bit ASUS X93S - Intel Core I7-NVIDIA GForce 540M 8GB Arbeitsspeicher Homepage : [...] | 15.03.2012 ▲ |
|
|
|
|
Julian Schmidt | Jup, das scheint ganz gut zu funktionieren.
Nur hatte ich mir vielmehr ein Beispiel zu meiner ersten Frage erhofft. Du hast aber eines zu meiner zweiten Frage erstellt. |
|
|
| |
|
|
|
Dieter Zornow | So sollte die Parameterübernahme klappen, mit ProfanX2 getestet
|
|
|
| XProfan X2Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 16.03.2012 ▲ |
|
|
|
|
RGH | Zur Frage 1: Im ersten Programm startest Du das zweite Programm ganz einfach mit WinExec() und hängst die Parameter einfach an den Aufruf dran. Wenn die Parameter Sonder- und/oder Leerzeichen enthalten, setzt Du sie in Anführungszeichen. Im zweiten Programm kannst Du diese Parameter über %ParCount, und Par$() abfragen (siehe Hilfe).
Zur Frage 2: Auch das geht ganz ohne API mit Create("FileMap",...) und MapFile(). Ein Beispiel findest Du in der Hilfe unter "28.13 - File-Mapping - Speicherdateien".
Gruß Roland |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 16.03.2012 ▲ |
|
|
|
|
Julian Schmidt | Ok, bin dann erstmal mit genug Infos bedient. Danke euch allen. |
|
|
| |
|
|
|
| RGH (16.03.12)
Zur Frage 1: Im ersten Programm startest Du das zweite Programm ganz einfach mit WinExec() und hängst die Parameter einfach an den Aufruf dran. Wenn die Parameter Sonder- und/oder Leerzeichen enthalten, setzt Du sie in Anführungszeichen. Im zweiten Programm kannst Du diese Parameter über %ParCount, und Par$() abfragen (siehe Hilfe).
MAX_PATH = 260 und das sind nicht so dolle viele Zeichen zumal da der Programmpfad und Dateiname auch schon enthalten ist.
Aus dem Grund kann man empfehlen lediglich ein Handle als Parameter zu übergeben -
z.B. das hWnd-Handle damit das aufgerufene Programm weiß wohin es Nachrichten senden soll.
Das Kommunizieren ist wiederum per wm_copyData ( [...] ) sehr einfach auch ohne Speicherdatei. XProfan-Beispiel: [...]
Ich würde vermutlich aber anders als in diesem XProfan-Beispiel die so genannte SubClassProc nutzen -
UserMessages sind wiederum für eine sichere Verarbeitung dieser wm_copyData-Nachricht nicht geeignet. |
|
|
| |
|
|
|
Jörg Sellmeyer | Ich glaube nicht, daß die Länge des Programmpfades was mit der Länge der Parameter zu tun hat. Angehängtes Programm samt Ordner mal in ein Verzeichnis auf eurem Desktop packen und starten.
Es ist dieser Code:
|
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 16.03.2012 ▲ |
|
|
|
|
| Auch interessant:
stürzt bei mir ab.
Hier CreateProcess ( [...] ):
The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If lpApplicationName is NULL, the module name portion of lpCommandLine is limited to MAX_PATH characters. |
|
|
| |
|
|
|
Jörg Sellmeyer |
lpApplicationName is NULL
keine Ahnung, was das heißen soll. Welcher ApplicationName ist denn NULL? |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 16.03.2012 ▲ |
|
|
|
| |
|
- Seite 2 - |
|
|
| Na wenn man für den ersten Parameter 0 einsetzt: [...]
Sie schreiben zwar "the module name portion of lpCommandLine is limited to MAX_PATH characters" und eben nicht das die Parameter nicht länger sein dürfen aber mit XProfan krachts ja dennoch.
Deshalb mein Tip nur ein Handle als Param zu übergeben weil ich das mit der dahingehenden Kracherei halt schon kenne. |
|
|
| |
|
|