PDA

Vollständige Version anzeigen : Named Pipes mit / in VBScript


notloesung101
03.07.2007, 06:26
Guten Morgen allerseits,

habe folgendes Problem:
Ich will aus VBScript heraus eine andere Anwendung aufrufen.
Die „andere“ Anwendung führt eine Berechnung durch und gibt einen Wert zurück.
Unter Umständen sollen schon Teilrückgabewerte zurück geliefert werden.
Nachdem die Berechnung durchgelaufen ist, schließt sich die Anwendung und das VBScript läuft dann weiter.

Die andere Anwendung ist eine .Exe. Der Aufruf via Dll fällt aus, da keine COM-Schnittstelle vorhanden.

Bleiben, meiner Meinung nach, nur noch Named Pipes mit denen sich solch eine Kommunikation realisieren lässt.

Vorgestellt habe ich mir folgendes Szenario:
Das VBScript läuft und gelangt irgendwann an den Punkt an den die .Exe eine Berechnung durchführen muss. Bevor die Exe aufgerufen wird, erstellt das VBScript eine Named Pipe (als Server). Startet dann die Exe, die wiederum einen Named Pipe Client startet. Darüber unterhalten sich die Anwendungen miteinander. D.h. der Server hört die Named Pipe solange ab, bis vom Client ein „Ende“ kommt.

Leider habe ich bisher nur beispiele für VB im Netz gefunden. Diese, mit wenig Wissen, versucht in VBScript zu implementieren – doch leider Fehlanzeige.

F R A G E:
Ist jem. von Euch schon mal auf solch ein Beispiel gestoßen oder hat bereits selbst damit Erfahrungen gesammelt? Ich suche also ein Beispiel wie ein Named Pipe in VBScript realisiert wird.

Für Anregungen bin ich sehr dankbar.

Gruß,
Notloesung

Torsten Karusseit
11.09.2007, 14:11
Ich habe so was schon mal versucht.
Unter WinXP ging es auch.
Die zu steuernde Anwendung war bei mir ein Konsolenprogramm.
Die steuernde Anwendung war ein VBA Kode in einer Access Form.
Das Konsolenprogramm erzeugt beim Start zwei Threads, einen zum Lesen und einen zum Schreiben. Jeder Thread erzeugt eine named pipe.
Der VBA Kode öffnet diese pipes wie normale Datein, und liest und schreibt von/aus ihnen.
Hier ein paar Fragmente:

HANDLE h;
h = CreateNamedPipe("\\\\.\\pipe\\y",
// PIPE_ACCESS_DUPLEX, // Beide Richtungen
PIPE_ACCESS_OUTBOUND, // nur schreiben
PIPE_TYPE_BYTE | PIPE_WAIT,
1, // hoechstens eine Verbindung,
0, // out Buffer
0, // in Buffer
0, // Timeout in Millisekunden
NULL); // Sicherheitsdesk
if(h == INVALID_HANDLE_VALUE)
{
if(Debug)
{
char str[100];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),0,str,100,0);
cerr << "PipeSchreibe Fehler: CreateNamedPipe " << str << endl;
}
return 1;
}
// Auf eine Verbindung warten
ConnectNamedPipe(h,0);
...
WriteFile(h,puffer,1,&ii,NULL);


HANDLE h;
h = CreateNamedPipe("\\\\.\\pipe\\x",
// PIPE_ACCESS_DUPLEX, // Beide Richtungen
PIPE_ACCESS_INBOUND, // nur lesen
PIPE_TYPE_BYTE | PIPE_WAIT,
1, // hoechstens eine Verbindung,
0,0, // keine Buffer
0, // Timeout in Millisekunden
NULL); // Sicherheitsdesk
// Auf eine Verbindung warten
ConnectNamedPipe(h,0);
...
ReadFile(h,puffer,sizeof(puffer),&ii,NULL);


Private Function FunctionLese() As String
On Error GoTo FunctionLese_Error0
Dim t As String
Dim c
Dim l
Dim zeit
t = ""
Do While True
Rem l = FileLen("\\.\pipe\y") geht nicht mit pipes
Open "\\.\pipe\y" For Input As 1
zeit = Timer + 0.2
Do While zeit > Timer
DoEvents
Loop
l = LOF(1)
Do While l > 0
c = Input(1, 1)
t = t + c
l = l - 1
Loop
Close 1
zeit = Timer + 0.2
Do While zeit > Timer
DoEvents
Loop
Loop
FunctionLese_Error0:
FunctionLese = t
End Function


Private Function SubSchreibe(t As String) As String
On Error GoTo SubSchreibe_Error0
Close #1
Open "\\.\pipe\x" For Output As #1
Print #1, t
Close #1
SubSchreibe = "ok"
Exit Function
SubSchreibe_Error0:
SubSchreibe = "Gerätetreiber läuft nicht"
End Function

Ich hoffe, das hilft Dir weiter