Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL ignorieren wenn nicht im Pfad (https://www.delphipraxis.net/175591-dll-ignorieren-wenn-nicht-im-pfad.html)

EWeiss 3. Jul 2013 09:06

AW: DLL ignorieren wenn nicht im Pfad
 
Die Frage wäre dann wo liegt der Unterschied denn die von lbccaleb
vorgeschlagene funktioniert eigentlich so wie sie soll.

Muss ja nicht mit Gewalt ein Exeption erstellen wenn es vermeidbar ist.

gruss

DeddyH 3. Jul 2013 09:08

AW: DLL ignorieren wenn nicht im Pfad
 
Viel interessanter finde ich die Frage, was passiert, wenn die DLL die entsprechende Routine gar nicht exportiert. Mit GetProcAddress erhalte ich einen Nil-Pointer, aber bei Delayed Loading?

EWeiss 3. Jul 2013 09:17

AW: DLL ignorieren wenn nicht im Pfad
 
Zitat:

Zitat von DeddyH (Beitrag 1220532)
Viel interessanter finde ich die Frage, was passiert, wenn die DLL die entsprechende Routine gar nicht exportiert. Mit GetProcAddress erhalte ich einen Nil-Pointer, aber bei Delayed Loading?

Wie schon gesagt man muss nicht absichtlich exeption generieren..

Das reicht mir so für die eine function ;)

Delphi-Quellcode:
  BASS_WASAPI_GetData : function(buffer: Pointer; length: DWORD): DWORD;
Delphi-Quellcode:
  if FileExists(ExtractFilePath(paramstr(0)) + basswasapi) then
  begin
    WasabiHandle := LoadLibrary(basswasapi);
    if WasabiHandle <> 0 then
    begin
      @BASS_WASAPI_GetData := GetProcAddress(WasabiHandle, 'BASS_WASAPI_GetData');
      if not Assigned (BASS_WASAPI_GetData) then
      begin
        ShowMessage('"Dynamic load"' + #13#10 + 'loading.. function BASS_WASAPI_GetData fail');
        Halt;
      end;
    end;
  end;
gruss

DeddyH 3. Jul 2013 09:19

AW: DLL ignorieren wenn nicht im Pfad
 
Ja eben, so hast Du wenigstens die Kontrolle, wenn auch etwas mehr Tipparbeit.

EWeiss 3. Jul 2013 09:26

AW: DLL ignorieren wenn nicht im Pfad
 
Und der Rest macht auch keine Problem..

Delphi-Quellcode:
         if WasabiHandle and MixerHandle <> 0 then
         begin
           if UseWASAPI then
             Data := BASS_WASAPI_GetData(@SpectrumData, BASS_DATA_FFT2048)
           else
           Data := BASS_Mixer_ChannelGetData(FChannelId, @SpectrumData, BASS_DATA_FFT2048);

           if Data = -1 then
             BASS_ChannelGetData(FChannelId, @SpectrumData, BASS_DATA_FFT2048);
         end else
         BASS_ChannelGetData(FChannelId, @SpectrumData, BASS_DATA_FFT2048);
damit bin ich hiermit fertig :)

gruss

Der schöne Günther 3. Jul 2013 09:27

AW: DLL ignorieren wenn nicht im Pfad
 
Ich sehe den Unterschied nicht. Das
Delphi-Quellcode:
delayed
-Schlüsselwort verursacht beim Aufruf genauso eine
Delphi-Quellcode:
EExternalException
wenn die Datei nicht existiert, als wenn der Einsprungspunkt nicht existiert.

Aber wie gesagt, mein Geschmack ist es trotzdem auch nicht, ich suche mir den Kram auch lieber mit
Delphi-Quellcode:
GetProcAddress
selbst zusammen :-)

EWeiss 3. Jul 2013 09:29

AW: DLL ignorieren wenn nicht im Pfad
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1220547)
Ich sehe den Unterschied nicht. Das
Delphi-Quellcode:
delayed
-Schlüsselwort verursacht beim Aufruf genauso eine
Delphi-Quellcode:
EExternalException
wenn die Datei nicht existiert, als wenn der Einsprungspunkt nicht existiert.

Aber wie gesagt, mein Geschmack ist es trotzdem auch nicht, ich suche mir den Kram auch lieber mit
Delphi-Quellcode:
GetProcAddress
selbst zusammen :-)

Allemal schon interessant was anderes zu sehen aber manchmal ist mehr einfach Mehr ;)

gruss

lbccaleb 3. Jul 2013 12:28

AW: DLL ignorieren wenn nicht im Pfad
 
Zitat:

Zitat von EWeiss (Beitrag 1220536)
...
Delphi-Quellcode:
  if FileExists(ExtractFilePath(paramstr(0)) + basswasapi) then
  begin
    WasabiHandle := LoadLibrary(basswasapi);
    if WasabiHandle <> 0 then
    begin
      @BASS_WASAPI_GetData := GetProcAddress(WasabiHandle, 'BASS_WASAPI_GetData');
      if not Assigned (BASS_WASAPI_GetData) then
      begin
        ShowMessage('"Dynamic load"' + #13#10 + 'loading.. function BASS_WASAPI_GetData fail');
        Halt;
      end;
    end;
  end;
gruss

Noch nen Tipp am Rand: Ich würde es noch vermeiden bei einem erkannten Fehler die Anwendung einfach mit Halt zu beenden. Du könntest in dem Fall nen bereits geladenen Teil im Speicher behalten.
Beende also die Anwendung normal und stell sicher das alles entladen wurde.

Sherlock 3. Jul 2013 14:50

AW: DLL ignorieren wenn nicht im Pfad
 
Delphi-Quellcode:
delayed
bedeutet doch nur, daß die DLL überhaupt erst dann geladen wird, wenn sie auch verwendet wird (Arbeitsspeicherentlastung), die Direktive entbindet nicht von der Verantwortung zu prüfen, ob die DLL da ist und funktioniert.

Sherlock

EWeiss 3. Jul 2013 16:14

AW: DLL ignorieren wenn nicht im Pfad
 
Zitat:

Ich würde es noch vermeiden bei einem erkannten Fehler die Anwendung einfach mit Halt zu beenden.
In Anwendungen mache ich das auch nicht.
Aber bei dieser Bibliothek welche nur als wrapper funktioniert dürfte das egal sein.

Die Plugins beenden sich von allein.

Aber wenn ud meinst es wäre besser kann ich es ohne probleme noch ändern.

Delphi-Quellcode:
      if not Assigned (BASS_Mixer_ChannelGetData) then
      begin
        ShowMessage('"Dynamic load"' + #13#10 + 'loading.. function BASS_Mixer_ChannelGetData fail');
        FreeLibrary(MixerHandle);
        BassVis1.QuitVisPlugin;
      end;

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz