Externes Programm öffnen und schließen

4. Mai 2010 16:42

Hallo,

mit WSHShell ist es ja bekannterweise möglich Dateien (z.B. PDF) mit dem Windows Standardprogramm zu öffnen.

Meine Frage:

Ist es möglich ein aus Navision, mittels eines COM-Objekt (z.B. WSHShell), geöffnetes Programm wieder zu schließen.

Re: Externes Programm öffnen und schließen

4. Mai 2010 21:26

Du rufst das Programm modal auf? Wenn ja, du kriegst ja als Int die PID. Du könntest nun wiederum in WSHSHELL den Befehl geben die Anwendung mit dieser PID zu killen. Da wäre ich jetzt spontan draufgekommen.

Gruß,
Sebastian

Re: Externes Programm öffnen und schließen

4. Mai 2010 23:56

Ein Programm, das sich mit Alt+F4 beenden lässt, sollte sich mit
Code:
shell.Sendkeys "%{f4}"
auch beenden lassen.

Re: Externes Programm öffnen und schließen

5. Mai 2010 08:17

Sebastian Pfliegel hat geschrieben:Du rufst das Programm modal auf? Wenn ja, du kriegst ja als Int die PID. Du könntest nun wiederum in WSHSHELL den Befehl geben die Anwendung mit dieser PID zu killen. Da wäre ich jetzt spontan draufgekommen.

Gruß,
Sebastian

Nein ich rufe das Programm nicht modal auf.
Aber wie kann ich das Programm modal aufrufen???

Re: Externes Programm öffnen und schließen

5. Mai 2010 08:31

Sebastian Pfliegel hat geschrieben:Du rufst das Programm modal auf? Wenn ja, ...


Uuups, ich meine "Wenn nein, ...". Modal bedeutet ja, dass Navision solange nichts tun kann, bis die andere Anwendung sich beendet hat oder beendet wurde. Anders rum bedeutet das, wenn es nicht modal ist, läuft Navision mit seinem Code einfach weiter und kümmert sich nicht mehr um die Anwendung. Wenn du jetzt also von Navision gesteuert aus die Anwendung stoppen willst darfst du die Anwendung NICHT modal aufrufen.

Code:
WSH_Shell.Run(Command, WindowStyle, WaitOnReturn)


In dem Fall muss also WaitOnReturn false sein. Ich merke jetzt aber, dass WSHShell.Run den Rückgabewert der Funktion darstellt und nicht die PID. Das heißt du musst dir da etwas anderes einfallen lassen. Musst du in Navision steuern, wann die Anwendung beendet werden soll? Oder sind die Kriterien dafür unerheblich (z.B. Zeit; nach 1 Minute ...)?

Gruß,
Sebastian

Re: Externes Programm öffnen und schließen

5. Mai 2010 10:35

Ich habe mir zum Töten eines Prozesses mal was in der MSDN gesucht und rüber geholt, vielleicht nützt das ja was:
Code:
Function TerminateProcess(ProcessName : Text[150])
Var:
Name   DataType   Subtype   Length
Scr   Automation   'Microsoft Script Control 1.0'.ScriptControl   
txtCR   Text      30
txtCode   Text      1024
txtExecQuery   Text   250


CREATE(Scr);
Scr.Language:='VBScript';

txtExecQuery:=strsubstno('("Select * from Win32_Process Where Name = ''%1''")',ProcessName);

txtCR:=' ';
txtCR[1]:=13;

txtCode := 'strComputer = "."' + txtCR +
           'Set objWMIService = GetObject("winmgmts:" _' + txtCR +
           '& "{impersonationLevel=impersonate}!\\" _' + txtCR +
           '& strComputer & "\root\cimv2")' + txtCR +
           'Set colProcessList = objWMIService.ExecQuery _' + txtCR +
           txtExecQuery + txtCR +
           'For Each objProcess in colProcessList' + txtCR +
           'objProcess.Terminate()' + txtCR +
           'Next';

Scr.ExecuteStatement(txtCode);
Clear(Scr);

Re: Externes Programm öffnen und schließen

5. Mai 2010 11:05

MacClane, mit dem VBScript töten wir unser Navision, wenn sich die Anwender zu oft anmelden ;)
Hilft natürlich nur, wenn man weiß wie die Anwendung heißt (sollte man tun :P ) und die Anwendung nicht öfter ausgeführt wird, denn so wird jede Anwendung mit diesem Namen terminiert. Genauer ist die PID, welche du aber in Navision selbst beim Aufruf nicht erfährst.

Re: Externes Programm öffnen und schließen

5. Mai 2010 11:41

Sebastian Pfliegel hat geschrieben:Hilft natürlich nur, wenn man weiß wie die Anwendung heißt (sollte man tun :P )

Ja, deswegen sollte man den Namen des Prozesses auch als Parameter übergeben, oder? :wink:
Sebastian Pfliegel hat geschrieben:und die Anwendung nicht öfter ausgeführt wird, denn so wird jede Anwendung mit diesem Namen terminiert.

Der Nachteil ist mir auch klar. War ja nur ein Weg, einen Prozess zu töten ...

Re: Externes Programm öffnen und schließen

5. Mai 2010 11:44

Ist mir klar, dass es dir klar ist :-P

Ich wollte es nur Michael erläutern.

Re: Externes Programm öffnen und schließen

5. Mai 2010 11:52

Wieso sprichst du mich dann an? Nun bin ich verwirrt :mrgreen:

Re: Externes Programm öffnen und schließen

5. Mai 2010 12:33

McClane hat geschrieben:
Sebastian Pfliegel hat geschrieben:Hilft natürlich nur, wenn man weiß wie die Anwendung heißt (sollte man tun :P )

Ja, deswegen sollte man den Namen des Prozesses auch als Parameter übergeben, oder? :wink:


Und wie kann ich in Navision z.B. eine PDF mit WSHShell öffnen (dabei wird ja das Programm geöffnet, welches in den Explorereinstellungen für PDFs eingerichtet wurde) und dabei den Namen des Programms erfahren?

McClane hat geschrieben:
Sebastian Pfliegel hat geschrieben:und die Anwendung nicht öfter ausgeführt wird, denn so wird jede Anwendung mit diesem Namen terminiert.

Der Nachteil ist mir auch klar. War ja nur ein Weg, einen Prozess zu töten ...


Kann man auch irgendwie die eine Instanz des aufgerufenen Programms töten?

Re: Externes Programm öffnen und schließen

5. Mai 2010 12:55

Sebastian Pfliegel hat geschrieben:Genauer ist die PID, welche du aber in Navision selbst beim Aufruf nicht erfährst.

Weißt du, ob es in irgendeiner Automation einen Subtype gibt, in den man die ProcessCollection stopfen kann? Dann könnte man vielleicht vor dem Aufruf seines Programms schauen, wie viele mit dem Namen gefunden werden und welche PID sie haben. Wenn ich die Win32_Process richtig verstehe, kriegt man darüber doch auch die ProcessID. Wenn das ginge, könnte man nachher vergleichen, welche neu dazu gekommen ist. Dann müsste man ja den Prozess haben, den man gestartet hat.

Re: Externes Programm öffnen und schließen

5. Mai 2010 13:37

McClane hat geschrieben:Wieso sprichst du mich dann an? Nun bin ich verwirrt :mrgreen:

Nur der erste Satz war für dich bestimmt :)
Und nein, mit den ganzen Automations kenn ich mich recht schlecht aus.

@Michael:
Nun ja, du gibst einfach nur die Datei an die du öffnen willst (ohne Programm). Windows kümmert sich dann um das richtige Programm. GROßER NACHTEIL: Man weiß nicht welches Programm gestartet wurde, daher kann man auch schlecht wissen, welches man terminieren muss. Deswegen würde ich den Namen des Programms (+ Pfad) in eine Setup-Tabelle stecken und dann ausführen und terminieren.

Re: Externes Programm öffnen und schließen

5. Mai 2010 14:23

http://msdn.microsoft.com/de-de/library/system.diagnostics.process.id.aspx und dann das ganze in eine COM-DLL verpackt.

Allerdings weiß ich nicht, ob es so gut ist einfach so einen Prozess zu killen, den man von NAV aus zwar aufgerufen hat, der aber ggf. inzwischen anderweitig verwendet wird. Ich meine z. B. Acrobat aus NAV öffenn->PDF anzeigen-> PDF(s) aus Dateisystem ohne NAV öffnen -> Prozess killen? Oder Word aus NAV starten, parallel einen Brief anfangen und NAV killt dann Word? Da würde ich mich aber bedanken.

Volker