Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Funktionen werden nicht mehr aus der DLL geladen (https://www.delphipraxis.net/141451-funktionen-werden-nicht-mehr-aus-der-dll-geladen.html)

BAMatze 9. Okt 2009 07:20


Funktionen werden nicht mehr aus der DLL geladen
 
Hallo und guten Morgen an alle DP´ler,

Ist vieleicht gerade einfach noch zu früh am Morgen, aber irgendwie funktionieren folgende Proceduren nicht mehr wirklich, seit ich diese aus meinem Gesamtprojekt in ein kleineres und überschaubareres Projekt kopiert habe.
Hier erstmal die Proceduren:

Delphi-Quellcode:
function TP_Tisch.DLLHandle_zuweisen: boolean;
begin
  //Protokoll.Protokolleingang('Piezotisch', 'DLLHandle-Fkt');
  doFehlerevent(200);
  try
    TischDLL := TDLL_Datei.create('E816_DLL.dll');
    try
      result := TischDLL.Vorhanden;
      case result of
      true: DLL_Handle := TischDLL.Handle;
      false: begin
              doFehlerevent(101);
              DLL_Handle := 0;
             end;
      end;
    except
    doFehlerevent(201);
    result := false;
    end;
  finally
    // Beenden der Klasse
    TischDLL.Free;
  end;

  //Protokoll.Protokollausgang('Piezotisch', 'DLLHandle-Fkt');
end;

function TP_Tisch.DLLFunktionen_laden: boolean;
begin
  //Protokoll.Protokolleingang('Piezotisch', 'DLL-Fkt laden');
  E816_ConnectRS232 := GetProcAddress(DLL_Handle, 'E816_ConnectRS232');
  E816_CloseConnection := GetProcAddress(DLL_Handle, 'E816_CloseConnection');
  E816_IsConnected := GetProcAddress(DLL_Handle, 'E816_IsConnected');
  E816_MOV := GetProcAddress(DLL_Handle, 'E816_MOV');
  E816_MVR := GetProcAddress(DLL_Handle, 'E816_MVR');
  E816_SVO := GetProcAddress(DLL_Handle, 'E816_SVO');
  E816_qPOS := GetProcAddress(DLL_Handle, 'E816_qPOS');
  result := (DLL_Handle <> 0) and assigned(E816_ConnectRS232) and assigned(E816_CloseConnection)
            and assigned(E816_IsConnected) and assigned(E816_MOV) and assigned(E816_SVO);
  if not result then doFehlerevent(203);
  //Protokoll.Protokollausgang('Piezotisch', 'DLL-Fkt laden');
end;
Das Handle wird Problemlos gefunden und hat auch einen Wert, allerdings läd er (obwohl es auch die richtige DLL ist und am richtigen Ort liegt) die Funktionien im meinem kleineren Projekt nicht mehr. Im Gesamtprojekt hingegen funktioniert alles wunderbar. Grübel da jetzt gerade schon eine Stunde rum und sehe einfach keinen Grund für ein solches Verhalten.

Hoffe jemand kann mir helfen
BAMatze

[Edit] Die GetProcAddressen liefern alle nil zurück, was eigentlich nicht sein kann, da es die richtige Datei ist. Werde sie jetzt auch mal austauschen [/Edit]

fajac 9. Okt 2009 07:58

Re: Funktionen werden nicht mehr aus der DLL geladen
 
Wird die Dll möglicherweise im Destruktor von TDll_Datei wieder entladen? Du rufst ja am Ende der Methode DLLHandle_zuweisen TischDll.Free auf.

BAMatze 9. Okt 2009 08:06

Re: Funktionen werden nicht mehr aus der DLL geladen
 
Also ich glaube eigentlich nicht, bin mir aber nicht sicher, deswegen hier mal die Klasse:

Delphi-Quellcode:
Type TDLL_Datei = class
  private
    bDLL_vorhanden: boolean;
    sDLLName: string;
    hDLLHandle: THandle;
    function DLL_vorhanden: boolean;
  public
    constructor create(const sDateiName: string); reintroduce;
    destructor Destroy; override;
    property Vorhanden: boolean read bDLL_vorhanden;
    property Handle: THandle read hDLLHandle;
end;

constructor TDLL_Datei.Create(const sDateiName: string);
begin
  inherited create;
  sDLLName := sDateiName;
  bDLL_vorhanden := DLL_vorhanden;
end;

function TDLL_Datei.DLL_vorhanden: boolean;
var DLL_Handle: THandle;
begin
  try
    DLL_Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+ 'DLL\'+sDLLName));
    if DLL_Handle <> 0 then
      begin
        hDLLHandle := DLL_Handle;
        result := true;
      end
    else result := False
  except
    result := false;
  end;
end;

destructor TDLL_Datei.Destroy;
begin
  inherited Destroy;
end;
Also wie man sieht, lade ich dort die DLL, aber eigentlich gebe ich sie hier nicht frei. Könnte maximal sein, dass das schließen der Klasse dies macht, wobei das ganze so im großen Projekt wie gesagt alles ohne Probleme so funktioniert.

fajac 9. Okt 2009 08:10

Re: Funktionen werden nicht mehr aus der DLL geladen
 
Dann ermittle doch mal nach jedem Aufruf von GetProcAddress mit GetLastError ob Windows irgendwas dazu zu sagen hat.

BAMatze 9. Okt 2009 08:29

Re: Funktionen werden nicht mehr aus der DLL geladen
 
erste Aussage gestrichen.

Also habe die gleiche Nachricht, wenn ich GetLastError bei dem funktionierenden Projekt an gleicher Stelle verwende. Also muss die Nachricht, dass die Datei vom System nicht gefunden wurde, nicht zwingend was mit dem Problem zu tun haben.

[Edit] Das Handle ist auch beim laden der Funktionen das gleiche, welches beim Laden der DLL erstellt wird [/Edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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