Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10158
Erhaltene Danke: 1246

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 05.08.08 16:40 
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:
ausblenden 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:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Do 07.08.08 09: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

_________________
Ein Nutzer der Ecke ;-)
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10158
Erhaltene Danke: 1246

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 07.08.08 10: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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Fr 15.08.08 11: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!

_________________
Ein Nutzer der Ecke ;-)