[Gelöst] Externes Programm - prüfen ob es bereits läuft

27. März 2008 10:53

Guten Morgen,

ich hab da ein kleines Problem. Ich möchte externe Daten (in diesem Fall Autocad-Zeichnungen) über einen Button auf der Form in einem externen Programm öffnen. Nun lässt dieses Ding mehrere Instanzen von sich zu, und das soll abgefangen werden. Gibt es irgendwie eine Möglichkeit, das in einer Codeunit per Windows Scripting Host zu überprüfen und darüber dann eventuell vorhandene Instanzen zu schliessen, bevor ich eine neue Instanz des Grafikprogramms starte?

MfG

Carsten
Zuletzt geändert von CaddyM am 27. März 2008 12:14, insgesamt 1-mal geändert.

27. März 2008 11:23

wäre es nicht vielleicht eleganter erstmal zu untersuchen, ob man das programm nicht so aufrufen kann, dass es nur eine Instanz gibt? Es gibt verschiedene Programme (allgemein gesprochen), die multi-instanz als standard haben, aber mit einer aufrufoption daraus einen single-instanz aufruf machen (ghostview zB.)

27. März 2008 12:05

Hallo.

Mit den angehängten Routinen kannst Du das prüfen.

Code:
WmiProccessRunning(pHost : Text[30];pExefile : Text[100]) pRunning : Boolean
----------------------------------------------------------------------------
  # oWmiSWbemLocator   Automation   'Microsoft WMI Scripting V1.2 Library'.SWbemLocator   
  # oWmiSWbemServices   Automation   'Microsoft WMI Scripting V1.2 Library'.SWbemServices   
  # oWmiSWbemObjectSet   Automation   'Microsoft WMI Scripting V1.2 Library'.SWbemObjectSet   
  # lSelect   Text      250

  // WmiProccessRunning : läuft Programm (Task) ?

  IF pHost = '' THEN
    pHost := '.';

  IF ISCLEAR(oWmiSWbemLocator) THEN
    CREATE(oWmiSWbemLocator);

  oWmiSWbemServices := oWmiSWbemLocator.ConnectServer(pHost);

  lSelect := STRSUBSTNO ('select name, description from Win32_Process where name="%1"', pExefile)

  oWmiSWbemObjectSet := oWmiSWbemServices.ExecQuery(lSelect);

  IF (oWmiSWbemObjectSet.Count > 0) THEN
    pRunning := TRUE
  ELSE
    pRunning := FALSE;


Code:
WmiProccessRunningCount(pHost : Text[30];pExefile : Text[100]) : Integer
----------------------------------------------------------------------------
  # oWmiSWbemLocator   Automation   'Microsoft WMI Scripting V1.2 Library'.SWbemLocator   
  # oWmiSWbemServices   Automation   'Microsoft WMI Scripting V1.2 Library'.SWbemServices   
  # oWmiSWbemObjectSet   Automation   'Microsoft WMI Scripting V1.2 Library'.SWbemObjectSet   
  # lSelect   Text      250

  // WmiProccessRunningCount : wie häufig läuft Programm (Task) ?


  IF pHost = '' THEN
    pHost := '.';

  IF ISCLEAR(oWmiSWbemLocator) THEN
    CREATE(oWmiSWbemLocator);

  oWmiSWbemServices := oWmiSWbemLocator.ConnectServer(pHost);

  lSelect := STRSUBSTNO ('select name, description from Win32_Process where name="%1"', pExefile);

  oWmiSWbemObjectSet := oWmiSWbemServices.ExecQuery(lSelect);

  EXIT (oWmiSWbemObjectSet.Count);


AUFRUF
Code:
WmiProccessRunning('','Excel.exe');   // läuft Excel auf diesem Rechner

27. März 2008 12:14

Hallo,

ja fein - das ist eine gute Lösung. Vielleicht will der Anwender ja dass zumindest 2 Instanzen des Programms laufen können, und so hab ich Einfluss darauf :wink:

Vielen Dank und Gruß

Carsten

28. März 2008 13:40

Super Sache.
Habe ich direkt mal in meine Tools-DB aufgenommen.