AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Eine Funktion der DLL erzeugt einen Fehler beim Schließen
Thema durchsuchen
Ansicht
Themen-Optionen

Eine Funktion der DLL erzeugt einen Fehler beim Schließen

Ein Thema von BAMatze · begonnen am 17. Jul 2009 · letzter Beitrag vom 22. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
BAMatze

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

Eine Funktion der DLL erzeugt einen Fehler beim Schließen

  Alt 17. Jul 2009, 14:26
Hallo an alle DP´ler und guten Tag,

Also hab nochmal eine Frage zu dynamisch geladenen Funktionen aus einer DLL. Muss dazu sagen, habe diese Funktionen alle schon statisch eingebunden und sie funktionierten einwandfrei. Jetzt bekomme ich bei einer Funktion immer einen Fehler ausgegeben.

Aber erstmal schnell die genauen Daten:

Delphi-Quellcode:
// Aus der Dokumentation der DLL (nur die verwendeten Funktionen aufgeführt)
{function MMC_COM_open(portnumber,baudrate:integer):integer;
            stdcall external ExtLib;
function MMC_COM_close:integer;
            stdcall external ExtLib; //
function MMC_sendCommand(pCmd:pChar):integer;
            stdcall external ExtLib; //
function MST_moving:integer;
            stdcall external ExtLib; //
function MMC_setDevice(newaxis:integer):integer;
            stdcall external ExtLib; // }



// Typdeklaration für die aus der dynamisch eingebundenen MMC.DLL zu ladenen
// Funktionen.
type TMMC_COM_open = function(portnumber,bautrate: integer):integer; stdcall;
type TMMC_close = function: integer; stdcall;
type TMMC_sendCommand = function(pCmd: pChar): integer; stdcall;
type TMST_moving = function: integer; stdcall;
type TMMC_setDevice = function(NewAxis: integer): integer; stdcall;

// Variablendeklaration der aus der dynamisch eingebundenen MMC.DLL zu ladenen
// Funktionen
var MMC_COM_open: TMMC_COM_open;
    MMC_close: TMMC_close;
    MMC_sendCommand: TMMC_sendCommand;
    MST_moving: TMST_moving;
    MMC_setDevice: TMMC_setDevice;

// im Implementierungsteil

function TV_Tische.DLLFunktionen_laden: boolean;
begin
  Protokoll.Protokolleingang('Verschiebetisch', 'DLL-Fkt laden');
  try
    if DLL_Handle <> 0 then //es wird überprüft, ob die DLL vorhanden ist und dann ein Handle zugewiesen
      begin
        // Es wurde festgestellt, dass nicht alle Funktionen, die in der DLL vorhanden
        // sind wirklich für die Umsetzung des Programmes benötigt werden. Deswegen
        // werden hier nur die wirklich verwendeten Funktionen eingebunden, um auch die
        // Resourcen für das Programm zu beschränken
        @MMC_COM_open := GetProcAddress(DLL_Handle, 'MMC_COM_open');
        @MMC_close := GetProcAddress(DLL_Handle, 'MMC_close');
        @MMC_sendCommand := GetProcAddress(DLL_Handle, 'MMC_sendCommand');
        @MST_moving := GetProcAddress(DLL_Handle, 'MST_moving');
        @MMC_setDevice := GetProcAddress(DLL_Handle, 'MMC_setDevice');
        result := true;
      end
    else
      begin
        Fehlermeldung(103);
        result := false;
      end
  except
    Fehlermeldung(104);
    result := false;
  end;
  Protokoll.Protokollausgang('Verschiebetisch', 'DLL-Fkt laden');
end;

destructor TV_Tische.Destroy;
begin
  Bremsen(1);
  MMC_close; //<-- hier taucht ein Fehler auf in Adresse 0000000
  Bewegungsueberwachung.free;
  TischDLL.Free;
  Protokoll.Protokollausgang('Verschiebetisch', 'Destroy');
  inherited Destroy;
end;
Beim Beenden der MainForm wird mir ein Fehler gemeldet, der in der MMC_close-Funktion auftritt. Allerdings kann ich mir nocht nicht erklären, woher dieser Fehler kommt, da sämtliche anderen Funktionen ohne Probleme ausgeführt werden. Die Verwendung der statischen Funktionen funktionierte ohne Probleme. Sieht jemand eventuell, was bei der Funktion falsch läuft?

Vielen Dank
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.081 Beiträge
 
Delphi 12 Athens
 
#2

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 17. Jul 2009, 14:29
wurde TV_Tische.DLLFunktionen_laden vorher auch aufgerufen?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 17. Jul 2009, 14:38
Das mit "0000000" heißt, dass die Funktion NIL ist.
Ich glaube - sowie mein Vorredner, dass die Function nicht richtig geladen wurde.
Wurde TV_Tische.DLL_Funktionen_laden 100% ig aufgerufen?

Mach mal ein
Delphi-Quellcode:
if not Assigned(MMC_Close) then
  MessageBoxA( 0, 'MMC_Close wurde nicht ordnungsgemäß geladen', 'Blabla', 0 );
vor dem Aufruf...

MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
BAMatze

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

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 17. Jul 2009, 14:39
Hab ich vergessen ebend mitzuschicken. Also in der MainForm wird die Initialisierungsfunktion (public-Funktion in der Klasse) aufgerufen, welche die Verfügbarkeit der Verschiebetischklasse prüft.

Hier der Quellcode für die Verfügbarkeit und Aufruf der DLLFunktionen_laden-Funktion:
Delphi-Quellcode:
function TV_Tische.Verfuegbarkeit: boolean;
begin
  Protokoll.Protokolleingang('Verschiebetisch', 'Verfügbarkeit');
  try
    if (DLLHandle_zuweisen = true) and (DLLFunktionen_laden = true) // Funktionsaufruf für laden der DLL-Funktionen
       and (ComPort_ermitteln = true) then result := true
    else
      begin
        Fehlermeldung(107);
        result := false;
      end
  except
    Fehlermeldung(108);
    result := false;
  end;
  Protokoll.Protokollausgang('Verschiebetisch', 'Verfügbarkeit');
end;
Wie gesagt, bei allen anderen Funktionen, die mit der Funktion geladen werden, ist alles ok und sie geben keine Fehlermeldung beim Aufruf.
2. Account Sero
  Mit Zitat antworten Zitat
BAMatze

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

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 22. Jul 2009, 08:59
gelöscht

Thema hat sich erledigt (wer lesen kann ist klar im Vorteil ) beim ruhigen überschauen und Blättern im Manuel des Gerätes ist folgendes aufgefallen (hatte ich sogar selbst hier gepostet):
Zitat:
function MMC_COM_close:integer;
stdcall external ExtLib; //
und nicht so wie ich es aufgerufen hab:

@MMC_close := GetProcAddress(DLL_Handle, 'MMC_close'); // sollte natürlich 'MMC_COM_close' sein Danke nochmal für eure Hilfe
BAMatze
2. Account Sero
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#6

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 22. Jul 2009, 09:08
Hi!

Unabhängig von der eigentlichen Problematik:
Man sollte Boolean-Werte nicht mit =true bzw. =false vergleichen. Besser wäre es so:

Delphi-Quellcode:
if (DLLHandle_zuweisen) and (DLLFunktionen_laden) // Funktionsaufruf für laden der DLL-Funktionen
       and (ComPort_ermitteln) then result := true
    else
Evtl. könnte man das auch noch so umbauen:

Delphi-Quellcode:
result:=(DLLHandle_zuweisen) and (DLLFunktionen_laden) // Funktionsaufruf für laden der DLL-Funktionen
       and (ComPort_ermitteln)
if (!result) then
 Fehlermeldung(107);
Aber das ist wahrscheinlich eher Geschmackssache.


Grüße, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
BAMatze

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

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 22. Jul 2009, 09:21
Also solche Hinweise finde ich eigentlich gut, weil ich ja eh nur learning by doing hier mache und kein Informatiker, werde dies mal versuchen in Teilen umzusetzen, wobei ich natürlich immer froh bin, wenn eine Sache funktioniert aber wie man sieht, kann sowas auch trügerisch sein.

Vielen Dank
2. Account Sero
  Mit Zitat antworten Zitat
22. Jul 2009, 09:44
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Hat definitiv mit Delphi zu tun. Nix allgemein
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.081 Beiträge
 
Delphi 12 Athens
 
#9

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 22. Jul 2009, 10:01
erstmal zur Fehlermeldung(104);
> GetProcAddress wird keine Exception auslösen, also ist diese Meldung, samt Try-Except "sinnlos"

und wenn du noch den Rückgabewert von GetProcAddress ausgewertet hättest, dann wär dir der falsche bzw. nicht vorhandene Name aufgefallen
Delphi-Quellcode:
function TV_Tische.DLLFunktionen_laden: boolean;
begin
  Protokoll.Protokolleingang('Verschiebetisch', 'DLL-Fkt laden');
  result := DLL_Handle <> 0;
  if result then
  begin
    @MMC_COM_open := GetProcAddress(DLL_Handle, 'MMC_COM_open');
    @MMC_COM_close := GetProcAddress(DLL_Handle, 'MMC_COM_close');
    @MMC_sendCommand := GetProcAddress(DLL_Handle, 'MMC_sendCommand');
    @MST_moving := GetProcAddress(DLL_Handle, 'MST_moving');
    @MMC_setDevice := GetProcAddress(DLL_Handle, 'MMC_setDevice');
    result := Assigned(MMC_COM_open) and Assigned(MMC_COM_close)
      and Assigned(MMC_sendCommand) and Assigned(MST_moving)
      and Assigned(MMC_setDevice);
  end;
  if not result then Fehlermeldung(103);
  Protokoll.Protokollausgang('Verschiebetisch', 'DLL-Fkt laden');
end;
Da GetProcAddress selber erstmal egal ist, ob das Handle gültig ist und im ungültigen Falle ebenfalls NIL zurückbibt, kann man alles z.B. so kürzen
Delphi-Quellcode:
function TV_Tische.DLLFunktionen_laden: boolean;
begin
  Protokoll.Protokolleingang('Verschiebetisch', 'DLL-Fkt laden');
  @MMC_COM_open := GetProcAddress(DLL_Handle, 'MMC_COM_open');
  @MMC_COM_close := GetProcAddress(DLL_Handle, 'MMC_COM_close');
  @MMC_sendCommand := GetProcAddress(DLL_Handle, 'MMC_sendCommand');
  @MST_moving := GetProcAddress(DLL_Handle, 'MST_moving');
  @MMC_setDevice := GetProcAddress(DLL_Handle, 'MMC_setDevice');
  result := Assigned(MMC_COM_open) and Assigned(MMC_COM_close)
    and Assigned(MMC_sendCommand) and Assigned(MST_moving)
    and Assigned(MMC_setDevice);
  if not result then Fehlermeldung(103);
  Protokoll.Protokollausgang('Verschiebetisch', 'DLL-Fkt laden');
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
BAMatze

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

Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe

  Alt 22. Jul 2009, 10:53
Zitat von himitsu:
> GetProcAddress wird keine Exception auslösen, also ist diese Meldung, samt Try-Except "sinnlos"

Delphi-Quellcode:
function TV_Tische.DLLFunktionen_laden: boolean;
begin
  ...
  result := DLL_Handle <> 0;
  ...
Ja das mit meinen try-except-Blöcken hatten mir schonmal ein paar Leute gesagt, hatte dafür auch mal einen extra Threat aufgemacht. Leider bin ich zur Umsetzung dieser Hinweise noch nicht gekommen. Da die Blöcke ja ihre Tätigkeit tun, sind sie derzeit auch noch nicht so hoch in der Priorität, werde ich aber vor Vollendung des Programmes definitiv ändern.

Ich hab mal eine Zeile stehen lassen aus deinem Quellcode, den du umgearbeitet hast. Kann man das wirklich so schreiben oder handelt es sich dabei um einen Copy/Paste-Fehler, bin da gerade ziemlich irritiert?
2. Account Sero
  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 05:50 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