10 Codezeilen erklären

  • VBScript

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Hibi.

    10 Codezeilen erklären

    Huhu :)

    Ich bin neu hier und habe schon eine Frage, ehr gesagt 10 Fragen. :rolleyes:
    Vor einigen Monaten habe ich ein Projekt gemacht, welches ich nun als Prüfungsthema zum Abschluss meine Ausbildung benütze.
    Eigentlich bin ich Programmeirer für unser ERP-System doch usste ich dafür inen kleinen Ausflug in VB machen.
    Das Projekt dient dazu, dass sich die Arbeit in der Endkontrolle erleichtert.
    Es wird aus unserem ERP-System die richtige Konstruktionszeichnung als PDF geöffnet und auf einem 2. Bildschirm angezeigt.
    Nun kommt eines der 2 .*vbs-Dateien zum Einsatz welches ich falls Fragen aufkommen nur Teilweiße erklären kann:

    Visual Basic-Quellcode

    1. set WshShell = WScript.CreateObject("WScript.Shell")
    2. WshShell.SendKeys("{F12}")
    3. WshShell.AppActivate "Rückmeldung Endkontrolle"

    1. Zeile: Objekt des Scripts wird erstellt?
    2. Zeile: Es wird die Taste "F12" gedrückt
    3. Zeile: Nun wird das Programm mit dem Titel "Rückmeldung Endkontrolle" in den Vordergrund geholt/oder aktiviert.

    Ich schätze das die Erklärung bis auf Zeile 1 Plausibel ist :)

    Am Ende der Arbeit wird dann automatisch die Zeichnung geschlosse, damit der nächste Artikel kontrolliert werden kann.

    Visual Basic-Quellcode

    1. set wmi = GetObject("winmgmts:")
    2. set system = wmi.instancesOf("win32_process")
    3. for each process in system
    4. if lcase(process.name)="pdfxcview.exe" then
    5. process.Terminate (0)
    6. end if
    7. next

    1. Zeile: Keine Ahnung ;(
    2. Zeile: Hole die Liste aller laufenen Prozesse?
    3. Zeile: Schleife - Untenstehende Anweißeung für jeden Prozess ausführen
    4. Zeile: Wenn der Prozessname im "lcase?" "pdfxcview.exe" ist, dann
    5. Zeile: Den Prozess beenden, was bedeutet die (0) ?
    6. Zeile: Ende der Wenn-Abfrage
    7. Zeile: Schleife - Nächster Prozess

    Habe mir den Code durch einige Schnipsel, die ich im Internet gefunden habe so zusammengebastelt ud sehr gefreit, dass es funktioniert hat :)
    Nun gehts ans erklären.

    Kann mir dabei jemand helfen, nicht das mein Prüfer ein VB-Profi ist und mich aufgrund unpassender Bemerkungen ein bisschen schlechter bewertet :)

    Gruß Hibi :rolleyes:

    Thema verschoben. MfG gs93

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „gs93“ ()

    Hallo,

    das ist VB 6 und älter und nicht VB .Net (in .Net würde man da einiges anders machen :P)
    1. Es wird ein WScript.Shell Objekt erzeugt. welches auf WinAPI basiert
    2. stimmt
    3. stimmt


    ...

    1. weiß ich selbst nicht genau, basiert aber auch mal wieder auf WinAPI
    2. richtig
    3. ja wenn du so willst...
    4. wenn der prozessname->kleingeschrieben = "pdfxcview.exe"
    5. ja beenden - 0 gibt den ExitCode an
    6. jo
    7. jo
    Mfg jvbsl
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    en.wikipedia.org/wiki/Application_programming_interface
    und davon hat Windows auch eine, mit dieser erstellt man ein Fenster, einen Button, eine TextBox usw. das gesamte .Net Framework greift darauf zurück...das heißt dies sind einfach eine große Funktionsliste, die Windows dir als Programmierer bereitstellt
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hi Hibi

    Das ist kein VB 6 wie meine Vorredner leider "falsch" bemerkten.. Das ist VB Script.
    Eine seit XP/2000 in Windows integrierte Script Sprache.
    VB script arbeitet mit dem Scripting Host. Entweder WScript oder CScript. WINAPI Zugriffe in dem Sinne wie in VB6 sind nicht möglich. Also keine P/Invokes oder dll imports (außer in Windows Registrierte ActiveX Objeckte, dies können .dll oder üblicherweise .ocx Dateien sein. Den genaue Aufbau kenn ich leider nicht. Es sind auf jedenfall COM objekte für VB script. Diese Können in Windows registriert werden per ausführen: regsvr32.exe bla.ocx)

    Zu deinen Fragen:

    set wmi = GetObject("winmgmts:")
    set system = wmi.instancesOf("win32_process")
    for each process in system
    if lcase(process.name)="pdfxcview.exe" then
    process.Terminate (0)
    end if
    next


    1. Zeile: Es gibt einen Windows Dienst Names Windows Management Instrumentation (Service)
    Läuft dieser Dienst, dann kann man über die WMI bibliotheken auf verschiedene Klassen und Namespaces von WMI zugreifen.
    Sinn ist eine Script/ bzw Programmgesteuerte Verwaltung des Betriebssystems. Man kann in Windows nahezu alles über WMI auslesen und einstellen. Wie genau WMI programmiert ist, weiss ich nicht. Aber dort wird sicher wieder auf die WinApi's zurückgegriffen.

    Der StandardNamespace für WMI ist root\cim2.
    set wmi = GetObject("winmgmts:") instanziert/verbindet wmi als ein WMI Objekt auf dem Lokalen PC (mit dem Standard Namespace root\cim2.)

    Nun hat man die Klassen aus dem cim2 namespace zur Verfügung.
    Eine dieser Klassen heißt ("win32_process") . Dieser stellt Methoden und Eigenschaften zur Verwaltung der Prozesse zur Vefügung.

    set system = wmi.instancesOf("win32_process") System ist damit eine Collection von allen Prozessen als zugreifbares objekt.

    in einer Schleife durchläuft man alle Prozesse. Dies könnte man zeitlich abkürzen durch:

    set system = wmi.instancesOf("win32_process where name=pdfxcview.exe")

    Man erkennt hier gut, das der aufbau wie eine SQL Abfrage aufgebaut ist. Man Verbindet sich quasi mit WMI und einer Klasse daraus.
    Beim Verbinden gibs auch gewisse Flags, wie die Collection verbunden werden soll. (zB eine Flag dafür, das man asynchron abfragt, oder eine andere die dafür sorgt, das das Durchlaufen schneller läuft in dem es die Collection nicht komplett einliesst und ausgibt sondern sie während der schleife abruft und danach gleich wieder verwirft, oder Security Authentication Level etc Siehe MSDN für Näheres)

    In der Schleife kann man nun alle Eigenschaften zB auslesen oder Methoden ausführen.
    process.name <- Eigenschaft, gibt einen Namen eines Prozesses wieder
    process.Terminate (parameter) <- Methode, Killt einen Prozess und kann optional einen Exit Code als Integer an den Prozess senden bzw an alle abhängigen Threads (Ein Exit Code für den Grund des Kills, ist wie gesagt optional)

    Diese Methode gibt auch einen Wert zurück, 0 im Falle eines erfolgs. Näheres Siehe MSDN

    Gruss mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Hehe, naja
    VB Scripts funktionieren aber so weder in VB6 noch .Net.
    Wenn du jedoch den Windows Scripting Host rauslässt (WScript). Kannst es fasst eins zu eins übernehmen.
    Und CreateObject funktioniert auch unter .NET noch. (Auch wenn es unüblich und unschön und unnötig ist)
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo Mono :)

    Danke für die ausführliche Erklärung.
    Ich denke das ich nun auf mögliche Fragen von Prüfern vorbereitet bin :)
    Wäre schlecht, wenn man sein eignes Projekt nicht erklären könnte...

    Die Seite ist nun ausgeruckt und wird gelernt.

    Gruß Hibi :rolleyes: