Otto: visual c++ prüfen ob ein programm existiert

Hallo zusammen,

ich bin jetzt das ersten mal in der Situation das ich ein Programm für die Windows Plattform schreiben muss.

Innerhalb dieses Programm möchte ich gern überprüfen ob Wireshark installiert ist. Leider könnte ich nichts passendes in der Windows API finden.

Wie mache ich das am besten?

Ich würde gern unabhängig vom Installationspfad sein und am besten sollte es auch ohne Admin Rechte laufen. Schön wäre es wenn ich den Installationspfad ermitteln könnte, dann kann ich noch prüfen ob bestimmte Plugins vorhanden sind.

Bin für jeden Tipp dankbar.

MfG
Otto

  1. moin,

    Bin für jeden Tipp dankbar.

    unter Windows gibts Laufwerke und die haben Buchstaben. a: und b: fallen schonmal weg, also hast Du nur noch c: bis z: zu prüfen.

    Ansonsten schau dir mal die Libs
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <ftw.h>
    #include <dirent.h>

    an, die kenne ich zumindest von c her. ftw ist das Herzstück:

    /*
    Wie dem auch sei, im Gegensatz zu vielen anderen Büchern, will ich hier nicht den üblichen Weg vorstellen, sondern die Funktion ftw(). Hier die Syntax von ftw():

    #include <ftw.h>

    int ftw(  const char *dir,
              int (*fn)(const char *file, const  struct stat *sb,
              int flag), int nopenfd   );

    Mit dieser Funktion beginnen Sie mit dem Durchforsten eines kompletten Verzeichnisbaums, angefangen bei dir. Für jeden gefundenen Eintrag im Verzeichnis dir (und allen Unterverzeichnissen) wird die Funktion fn() mit dem kompletten Pfadnamen, einem Zeiger auf die Struktur stat (siehe Kapitel 3) und einem Flag, welches folgenden Wert haben kann:

    * FTW_F  – Eintrag ist eine normale Datei.
        * FTW_D – Eintrag ist ein Verzeichnis.
        * FTW_DNR – Eintrag ist ein nicht lesbares Verzeichnis (meist mangelnde Zugriffsrechte).
        * FTW_SL – Eintrag ist ein symbolischer Link.
        * FTW_NS – Fehler bei stat, obwohl der Eintrag kein symbolischer Link ist.

    Damit die Funktion ftw() nicht alle für einen Prozess vorhandenen Filedeskriptoren für die offenen Verzeichnisse verwendet, können Sie mit dem Argument nopenfd die maximale Anzahl gleichzeitig geöffneter Verzeichnisse angeben. Sobald die Suchtiefe dann höher ist als nopenfd, bremst ftw() ein, da es einige Verzeichnisse schließt, um neue zu ändern. Diese müssen hinterher wieder geöffnet werden, um an der Stelle, an der ftw() aufgehört an, weiterzumachen.

    Die Funktion ftw() können Sie stoppen, indem Sie bei der Funktion fn() einen Wert ungleich 0 zurückgeben. 0 heißt weitermachen und ungleich 0 stopp. Ansonsten macht ftw() so lange weiter, bis alle Verzeichnisse und deren Einträge durchgeforstet sind. Tritt ein Fehler auf, wird -1 zurückgegeben.

    In dem folgenden Listing soll ein komplettes Verzeichnis mitsamt seinen Unterverzeichnissen ausgegeben werden. Es werden dabei alle Einträge angezeigt. Das Programm wurde mit Absicht relativ einfach und kurz gehalten. Tritt bspw. das Flag FTW_F in Erscheinung, sollten Sie die Strukturvariable st_mode von stat abfragen, ob es sich denn um eine normale Datei (S_IFREG), eine zeichenorientierte Gerätedatei (S_IFCHR), eine blockorientierte Gerätedatei (S_IFBLK), ein FIFO (S_IFIFO), einen symbolischen Link (S_IFLNK) oder ein Socket (S_IFSOCK) handelt. Natürlich können Sie auch weitere Attribute der einzelnen Einträge von der Struktur stat abfragen. Mehr zu stat im nächsten Kapitel. Hier das komplette Listing:

    */

    Frag mich nicht, wo ich das her hab ;)

    Hotte

    --
    Ein Passagier kotzt in die Tüte. Alles Nudeln, meine Güte!
    1. Hallo,

      unter Windows gibts Laufwerke und die haben Buchstaben.

      nicht notwendigerweise. Netzwerkverzeichnisse können beispielsweise auch über ihren UNC-Pfad angesprochen werden, auch wenn nicht alle Anwendungen damit umgehen können.

      a: und b: fallen schonmal weg

      Warum? Niemand hindert mich, einer Partition den Laufwerksbuchstaben A: oder B: zu geben, ebensowenig bei einer Netzwerkverbindung.

      Aber Hottes Holzhammer dient ja letztendlich nur dazu, eine bestimmte Datei zu finden. Das sagt noch nichts darüber aus, ob Wireshark auch installiert, d.h. im System bekanntgemacht ist. Aussagekräftiger dürfte eine Registry-Abfrage sein. Ich würde daher prüfen, ob der Schlüssel

      HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\wireshark.exe

      existiert. Wenn ja, ist das ein starkes Indiz dafür, dass Wireshark installiert ist, und als Dreingabe bekommt man unterhalb dieses Schlüssels als "(Standard)" auch noch den kompletten Pfadnamen zu wireshark.exe und als "Path" das Verzeichnis, in dem Wireshark installiert wurde.

      Ein alternativer Schlüssel, den man abfragen könnten, wäre noch

      HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Wireshark

      Dort findet man vor allem, wie der Schlüsselname schon vermuten lässt, die Uninstall-Informationen.

      So long,
       Martin

      --
      F: Wer ist der Herrscher über Wasser, Wind und Wellen?
      A: Der Friseur.
      1. hi Martin,

        Aber Hottes Holzhammer dient ja letztendlich nur dazu, eine bestimmte Datei zu finden.

        Genau. Noch genauer: Alle Ausführbaren und DLLs.

        [..] Ich würde daher prüfen, ob der Schlüssel
          HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\wireshark.exe
        existiert.

        Ab sofort hab ich Wireshark in meiner Registry stehen.......... done.

        SCNR ;-)
        Hotte

        --
        Die letzten Worte eines Tauchers: Blöder Hai, blubbbbblubb.
  2. Hallo,

    danke für die Anregungen.

    MfG
    Otto