Prüfen ob DLL bzw. ander Dateien vorhanden sind?

Anfängerfragen zum Programmieren mit PureBasic.
Aspirant
Beiträge: 101
Registriert: 19.10.2006 12:19

Prüfen ob DLL bzw. ander Dateien vorhanden sind?

Beitrag von Aspirant »

Hallo,

Ich suche eine Möglichkeit ob in *.dll im systempfad vorhanden ist
bzw ob Programm *.exe bereits Installiert ist (nicht nur standard Pfad)

Also Hilfe und suche habe ich benutzt

Ich danke für helfende Antworten





PS. nur mal ne info Frage wie kann ist das Laden der Libmysql.dll beschleunigen
Ich würde mich ja gerne geistig mit dir duellieren, aber wie ich sehe bist du unbewaffnet.
================================
WinXP Pro, W2k3, Eisfair
-----------------------------
PB 4.40 auf WinXPpro kauf
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Lassen wir das mit dem Duell mal und gehen lieber bei Gelegenheit einen Trinken.

Ich finde es gut, daß Du die Hilfe und die Suche schon konsultiert hast. Vermutlich lag es an den Suchbegriffen.
Mit "Durchsuchen" bzw "Systemordner" wärst Du schon weiter gekommen.

Zum Suchen habe ich folgendes für Dich geschrieben :

Code: Alles auswählen

Procedure GibtEsDirectoryeintrag (Pfad.s, SollName.s, SollExtension.s, SollTyp)
;Prüft die Existens eines Directoryeintrags
; Pfad.s z.B. "c:\"
; SollName.s z.B. "autoexec"
; SollExtension.s z.B. "bat"
; SollTyp 
;  entweder : #PB_DirectoryEntry_File
;  oder     : #PB_DirectoryEntry_Directory
; Diese Lösung ist nicht optimal aber so (hoffentlich) leicht zu verstehen

  If ExamineDirectory(0, Pfad.s, "*.*")
    Ergebnis = 0
    SollName.s = LCase(SollName.s)
    SollExtension.s = LCase(SollExtension.s)
    Repeat
     
      Typ = NextDirectoryEntry(0)
      If Typ = SollTyp
        Eintrag.s = LCase(DirectoryEntryName(0))
        If Eintrag
          Extension.s = GetExtensionPart(Eintrag)
          If Extension
            Name.s = Left(Eintrag.s, Len(Eintrag.s)-Len(Extension.s)-1) ; -1 wegen dem Punkt
            If (Name.s = SollName.s Or SollName.s = "*") And (Extension = SollExtension.s Or SollExtension.s = "*")
              ProcedureReturn #True
            EndIf
          EndIf
        EndIf
      EndIf
    Until Ergebnis Or Typ = 0
  EndIf
  ProcedureReturn #False
EndProcedure

Eine von vielen Lösungen um einen Verzeichnisbaum rekursiv (http://de.wikipedia.org/wiki/Rekursiv)durchzugehen gibt es unter http://www.purebasic.fr/german/viewtopic.php?t=7354.
Eine andere wäre z.B. http://www.purebasic.fr/german/viewtopic.php?t=7263


Unter http://www.purebasic.fr/german/viewtopic.php?t=767 (solltest Du durchlesen) habe ich u.a. folgendes gefunden :

Code: Alles auswählen

Structure EMID
  cb.b
  abID.b[1]
EndStructure

; Structure ITEMIDLIST
;   mkid.EMID
; EndStructure
; Die Struktur ist bei mir bereits definiert

Procedure.s GetSpecialeFolder(folder.l)
  *itemid.ITEMIDLIST = #NULL
  If SHGetSpecialFolderLocation_ (0, folder, @*itemid) = #NOERROR
    location.s = Space (#MAX_PATH)
    If SHGetPathFromIDList_ (*itemid, @location)
      If Right(location, 1) <> "\" : location + "\" : EndIf
      ProcedureReturn location
    EndIf
  EndIf
EndProcedure

Unter http://www.vbapihelpline.de/ref/funca.p ... h&Letter=s gibt es eine deutsche Auflistung der nötigen Konstanten (die sollten in PB schon definiert sein). Du brauchst also nur die beiden oberen Codeblöcke und z.B. folgendes in eine Datei kopieren.

Code: Alles auswählen

Pfad.s = GetSpecialeFolder(#CSIDL_WINDOWS) ;(nur IE ab version 5.0) Ermittelt das Verzeichnis "Windows"
Debug GibtEsDirectoryeintrag (Pfad.s, "explorer", "exe", #PB_DirectoryEntry_File)
Debug GibtEsDirectoryeintrag (Pfad.s, "*", "exe", #PB_DirectoryEntry_File)
Debug GibtEsDirectoryeintrag (Pfad.s, "explorer", "*", #PB_DirectoryEntry_File)
Debug GibtEsDirectoryeintrag (Pfad.s, "Explorer", "exe", #PB_DirectoryEntry_File)
PS
Bitte beachte, dass Du damit immer nur bestimmte Verzeichnisse durchsuchst. In der Praxis könnte der Pfad aber sowohl "C:\Programme\WinzigWeich\BlaBla\" als auch "C:\Programme\BlaBla\" sein. Zum Teil lautet er sogar "C:\PROGRAM FILES\...". Deshalb gibt es die Möglichkeit den tatsächlichen Pfad in der Registry einzutragen. Eine Prüfung ob die Datei tatsächlich existiert erübrigt sich dadurch nicht.
Aspirant
Beiträge: 101
Registriert: 19.10.2006 12:19

Beitrag von Aspirant »

Guten Morgen uweb,
ich danke dir erstmal für dein Codebeispiele das ist schon sehr viel wert. Ich hatte nicht mal sowas Ansatzweise gefunden.

Es ist mir durchaus klar das der Richtig suchbegriff das mass der dinge des wegen habe ich ja auch verschieden versucht. Doch meine Gedanke gänge waren leider nicht die der Breiten masse um das Problem zulösen, weswegen ich nachgefragt habe und eine sehr Brauchbare Antwort bekamm

Danke

werde jetzt erstmal weiter Basteln und mein Problem hoffentlich lösen könne

MFG Aspirant
Ich würde mich ja gerne geistig mit dir duellieren, aber wie ich sehe bist du unbewaffnet.
================================
WinXP Pro, W2k3, Eisfair
-----------------------------
PB 4.40 auf WinXPpro kauf
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Gerne geschehen !
Morgen hilfst Du vielleicht einem Anderen und der Kreis schließt sich.
Übrigens brauchst Du die Struktur "EMID" gar nicht.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Pfad.s = GetSpecialeFolder(#CSIDL_WINDOWS) ;(nur IE ab version 5.0) Ermittelt das Verzeichnis "Windows"
Gerade dafür sollte man GetSpecialeFolder nicht nehmen, (wegen IE Version)

Code: Alles auswählen

Define WinPath.s{#MAX_PATH}
GetWindowsDirectory_(@WinPath, #MAX_PATH)
If WinPath <> "" 
  If Right(WinPath, 1) <> "\" : WinPath + "\" : EndIf
EndIf
Debug WinPath

Define SysPath.s{#MAX_PATH}
GetSystemDirectory_(@SysPath, #MAX_PATH)
If SysPath <> "" 
  If Right(SysPath, 1) <> "\" : SysPath + "\" : EndIf
EndIf
Debug SysPath
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten