Entwickler-Ecke

Windows API - ...herausfinden, ob eine EXE/DLL im System verfügbar ist?


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; stdcallexternal 'dbghelp.dll';

function IsExeImageAvailable(const AImageName: String): Boolean;
  const
    MAX_PATH_SIZE = 4095;
  var
    ImageFilePath: String;
    Handle: THandle;
begin
  SetLength(ImageFilePath,MAX_PATH_SIZE);
  // http://msdn.microsoft.com/en-us/library/ms679342(VS.85).aspx
  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


Martin1966 - Do 07.08.08 10:11

Hallo Narses :wink2:

zu dem reinen Sourcecode kann ich gar nichts schreiben aber was mich interessieren würde: Was genau heißt denn "im System verfügbar"? Wie mache ich denn eine DLL im System "verfügbar"? Und vielleicht kannst du - speziell für mich - kurz erklären in welchen Fällen man deine Funktion gebrauchen könnte. Danke für eine kurze und knappe Antwort. ;-)

Lg, Martin


Narses - Do 07.08.08 11:00

Moin!

user profile iconMartin1966 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".

user profile iconMartin1966 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:

user profile iconMartin1966 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


Martin1966 - Fr 15.08.08 12:38

@Narses: Dank dir für die Erklärung. Ich hatte wohl ein kleines Brett vor den Kopf. Jetzt ist es mir aber klar. ;-) Danke!