AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL ignorieren wenn nicht im Pfad

Ein Thema von EWeiss · begonnen am 3. Jul 2013 · letzter Beitrag vom 3. Jul 2013
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 05:44
Wie man diese statisch/Dynamisch läd ist mir klar.
Mein Problem!

Ich möchte eine DLL wenn sie nicht im Pfad ist aber trotzdem als Unit bsp. BassMix
eingebunden ist ignorieren können wenn die Anwendung startet.
Geht so was?

Meine DLL soll also nicht zwingend auf die anderen DLL's angewiesen sein.

Bei Statisch eingebundenen DLL's verstehe ich das es nicht geht
Aber warum nicht bei Dynamischen.. welchen sinn hat dann LoadLibrary?

Ich verwende davon eine Function die ich theoretisch wenn das Handle 0 ist bei LoadLibrary überspringen könnte
Aber die Anwendung will immer die DLL.


gruss

Geändert von EWeiss ( 3. Jul 2013 um 06:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 06:16
Prüfe zu erst ob die Datei existent ist (FileExists) und dann führe LoadLibary aus.

Ich hatte das auch mal gemacht:

Delphi-Quellcode:
          if FileExists(ExtractFilePath(paramstr(0)) + szOSADSDLL) then begin;
            if not OSADSPlugIn_Load then
              raise Exception.Create(szLoadPlugInErr)
            else AppendMenu(hToolSubMenu, MF_STRING, 1101, 'OSADS DB Scan PlugIn');
          end;
Delphi-Quellcode:
function OSADSPlugIn_Load: Boolean;
begin
  Result := False;
  hOSADSDll := LoadLibrary(PChar(ExtractFilePath(paramstr(0)) + szOSADSDLL));
  if hOSADSDll <> 0 then begin
    OSADSSendData := GetProcAddress(hOSADSDll, 'SendData');
    Result := Assigned(OSADSSendData);
  end
  else OSADSPlugIn_Close;
end;
Oder hab ich dich jetzt falsch verstanden ? oO
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)

Geändert von lbccaleb ( 3. Jul 2013 um 06:24 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 06:25
Das problem ist aber sobald der Export bzw.. die Unit eingebunden ist verlangt die Anwendung die DLL.
Die Datei ansich zu laden bzw.. zu prüfen ob sie existiert stellt nicht mein problem da trotzdem Danke.

Meine Unit als uses eingebunden Bassmixer.pas ohne das ich jetzt irgendetwas aufrufe macht die Anwendung dicht
da die DLL nicht gefunden wurde das will ich abfangen da ich ansonsten zu meiner DLL jedesmal fremde Bibliotheken mit ausliefern muss.
Das kann ich aber nicht.
Wobei ich aber die funktionen benötige da ansonsten bei verwendung von Wasapi und Mixer keine Visualisierung stattfindet.

gruss

Geändert von EWeiss ( 3. Jul 2013 um 06:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 06:33
Kannst du dann die Unit nicht so abändern?

Die wird dann die dll auch so dynamisch laden wie oben..

(Ist zwar nicht das gelbe vom Ei in anderen Units rum zu fuschen aber ab und zu nötig )
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 06:40
Wie soll ich die abändern? (Darum geht es ja)

Kleines Beispiel von einem Sample von delphi.about.com alles mal copy/paste

function CircleArea(const radius : double) : double; external 'circle.dll'; dynamisch laden..
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
type
  TCircleAreaFunc = function (const radius: double) : double; stdcall;
var
  dllHandle : cardinal;
  circleAreaFunc : TCircleAreaFunc;
begin
  dllHandle := LoadLibrary('circle.dll');
  if dllHandle <> 0 then
  begin
    @circleAreaFunc := GetProcAddress(dllHandle, 'CircleArea');
    if Assigned (circleAreaFunc) then
      ShowMessage('dynamic: ' + FormatFloat(',.00',circleAreaFunc(StrToFloat(Edit1.Text))))
    else
      ShowMessage('"CircleArea" function not found');
    FreeLibrary(dllHandle);
  end
  else
  begin
    ShowMessage('circle.dll not found / not loaded');
  end;
end;
dynamisch.. auch das teil verlangt nach der DLL
da die Function CircleArea im Header diese erwartet.

wie soll ich das umgehen das der Compiler diese ignoriert und nicht mehr nach der DLL sucht/Fragt.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von lbccaleb
lbccaleb

Registriert seit: 25. Mai 2006
Ort: Rostock / Bremen
2.037 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 06:49
Also ich habe die Function in der Unit global als Variable angegeben:


Delphi-Quellcode:
var
  OSADSSendData: function(Addresse, Data: WideString; AjaxFunc: TAjaxEvenFunc): WideString;// overload;
und dann halt dynamisch geladen, wie oben zu sehen ist. Das gab bisher noch keine Probleme...
Martin
MFG Caleb
TheSmallOne (MediaPlayer)
Die Dinge werden berechenbar, wenn man die Natur einer Sache durchschaut hat (Blade)

Geändert von lbccaleb ( 3. Jul 2013 um 06:51 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 06:51
Also ich habe die Function global als Variable angegeben:


Delphi-Quellcode:
var
  OSADSSendData: function(Addresse, Data: WideString; AjaxFunc: TAjaxEvenFunc): WideString;// overload;
und dann halt dynamisch geladen, wie oben zu sehen ist. Das gab bisher noch keine Probleme...
Ahhh das könnte klappen
Werde das mal versuchen denke dieses External macht diese problem.

Danke dir

gruss

Geändert von EWeiss ( 3. Jul 2013 um 07:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 07:03
Klar, mit external ist es ja statisches Laden. Wie schon gesagt, LoadLibrary/GetProcAddress benutzen und Rückgaben auswerten, wenn Ersteres 0 ist, konnte die DLL nicht geladen werden, wenn Letzteres nil ist, konnte die Routine nicht geladen werden (wurde nicht exportiert etc.).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 07:19
Klar, mit external ist es ja statisches Laden. Wie schon gesagt, LoadLibrary/GetProcAddress benutzen und Rückgaben auswerten, wenn Ersteres 0 ist, konnte die DLL nicht geladen werden, wenn Letzteres nil ist, konnte die Routine nicht geladen werden (wurde nicht exportiert etc.).
Ja.. Du hast recht irgendwie auch logisch.
Hab das vergessen das external = statisches Laden ist.

Jetzt funktioniert es wie es soll

Danke euch.

gruss

Geändert von EWeiss ( 3. Jul 2013 um 07:22 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: DLL ignorieren wenn nicht im Pfad

  Alt 3. Jul 2013, 08:48
Mein Geschmack ist es nicht, aber das hier ist doch eigentlich genau das, was du willst, oder?

Delayed Loading of a DLL von François Piette:

Zitat:
Just add delayed keyword in each function declaration and suddenly a static DLL is loaded the first time one of his functions is called. If you never call a DLL’s function, then the DLL is not loaded at all.
Könnte dann bsp. so aussehen:

Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  function GetSomething: Integer; external 'somelibrary.dll' delayed;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
   try
      GetSomething();
   except
      on EExternalException do ShowMessage('DLL nicht gefunden');
   end;
end;

end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz