Narses - Di 05.08.08 17:40
Titel: ...herausfinden, ob eine EXE/DLL im System verfügbar ist?
Wie kann man herausfinden, ob eine bestimmte EXE oder DLL im System verfügbar ist?
Dafür gibt es eine API-Funktion, die z.B. so gekapselt werden könnte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function FindExecutableImage(FileName: PChar; SymbolPath: PChar; ImageFilePath: PChar): THandle; stdcall; external 'dbghelp.dll';
function IsExeImageAvailable(const AImageName: String): Boolean; const MAX_PATH_SIZE = 4095; var ImageFilePath: String; Handle: THandle; begin SetLength(ImageFilePath,MAX_PATH_SIZE); Handle := FindExecutableImage(PChar(AImageName), PChar(GetEnvironmentVariable('Path')), PChar(ImageFilePath)); Result := (Handle <> 0); if Result then CloseHandle(Handle); end; |
Anwendung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); const MODULE_NAME = 'libmysql.dll'; begin if IsExeImageAvailable(MODULE_NAME) then ShowMessage(MODULE_NAME+' ist verfügbar.') else ShowMessage(MODULE_NAME+' ist NICHT verfügbar!'); end; |
cu
Narses
Narses - Do 07.08.08 11:00
Moin!
Martin1966 hat folgendes geschrieben: |
was mich interessieren würde: Was genau heißt denn "im System verfügbar"? |
Ich verwende die Path-Environment-Variable, also "über die Systempfade lokalisierbar".
Martin1966 hat folgendes geschrieben: |
Wie mache ich denn eine DLL im System "verfügbar"? |
Naja, du machst sie nicht verfügbar, sondern ein Binding könnte klappen (statisch oder LoadLibrary). :idea:
Martin1966 hat folgendes geschrieben: |
Und vielleicht kannst du - speziell für mich - kurz erklären in welchen Fällen man deine Funktion gebrauchen könnte. |
Ich dachte eigentlich, dass mein Beispiel oben schon einen klassischen Fall darstellt :gruebel: offensichtlich nicht :?
Nehmen wir an, du möchtest die "libmysql.dll" statisch oder dynamisch binden. Dazu muss sie im Programm- oder in einem Systempfad liegen. Wenn es statisch nicht klappt, dann gibt´s eh eine Systemfehlermeldung beim Programmstart, klar. Wenn du aber vor dem dynamischen Binden eine qualifizierte Fehlermeldung ausgeben willst, falls das Modul fehlt (z.B. was man denn tun muss oder so), müsstest du erstmal alle Pfade abklappern, um sagen zu können, ob das Modul überhaupt vorhanden ist.
Anderes Beispiel: du willst ein bestimmtes Kommandozeilen-Utility nutzen, sagen wir mal PuTTY.exe. Mit der Funktion könntest du herausfinden, ob ein Aufruf mit relativem Pfad klappen wird oder durch leichte Modifikation sogar den Pfad zum ExeImage erhalten. :idea:
cu
Narses