AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktionen werden nicht mehr aus der DLL geladen
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionen werden nicht mehr aus der DLL geladen

Ein Thema von BAMatze · begonnen am 9. Okt 2009 · letzter Beitrag vom 9. Okt 2009
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

Funktionen werden nicht mehr aus der DLL geladen

  Alt 9. Okt 2009, 08:20
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]
2. Account Sero
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#2

Re: Funktionen werden nicht mehr aus der DLL geladen

  Alt 9. Okt 2009, 08:58
Wird die Dll möglicherweise im Destruktor von TDll_Datei wieder entladen? Du rufst ja am Ende der Methode DLLHandle_zuweisen TischDll.Free auf.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Funktionen werden nicht mehr aus der DLL geladen

  Alt 9. Okt 2009, 09:06
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.
2. Account Sero
  Mit Zitat antworten Zitat
fajac

Registriert seit: 1. Jul 2009
60 Beiträge
 
#4

Re: Funktionen werden nicht mehr aus der DLL geladen

  Alt 9. Okt 2009, 09:10
Dann ermittle doch mal nach jedem Aufruf von GetProcAddress mit GetLastError ob Windows irgendwas dazu zu sagen hat.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Funktionen werden nicht mehr aus der DLL geladen

  Alt 9. Okt 2009, 09:29
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]
2. Account Sero
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:04 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