![]() |
Eine Funktion der DLL erzeugt einen Fehler beim Schließen
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:
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?
// 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; Vielen Dank BAMatze |
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
wurde TV_Tische.DLLFunktionen_laden vorher auch aufgerufen?
|
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
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:
vor dem Aufruf...
if not Assigned(MMC_Close) then
MessageBoxA( 0, 'MMC_Close wurde nicht ordnungsgemäß geladen', 'Blabla', 0 ); MfG |
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
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:
Wie gesagt, bei allen anderen Funktionen, die mit der Funktion geladen werden, ist alles ok und sie geben keine Fehlermeldung beim Aufruf.
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; |
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
gelöscht
Thema hat sich erledigt (wer lesen kann ist klar im Vorteil :evil: ) beim ruhigen überschauen und Blättern im Manuel des Gerätes ist folgendes aufgefallen (hatte ich sogar selbst hier gepostet): Zitat:
Delphi-Quellcode:
Danke nochmal für eure Hilfe
@MMC_close := GetProcAddress(DLL_Handle, 'MMC_close'); // sollte natürlich 'MMC_COM_close' sein
BAMatze |
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
Hi!
Unabhängig von der eigentlichen Problematik: Man sollte Boolean-Werte nicht mit =true bzw. =false vergleichen. Besser wäre es so:
Delphi-Quellcode:
Evtl. könnte man das auch noch so umbauen:
if (DLLHandle_zuweisen) and (DLLFunktionen_laden) // Funktionsaufruf für laden der DLL-Funktionen
and (ComPort_ermitteln) then result := true else
Delphi-Quellcode:
Aber das ist wahrscheinlich eher Geschmackssache.
result:=(DLLHandle_zuweisen) and (DLLFunktionen_laden) // Funktionsaufruf für laden der DLL-Funktionen
and (ComPort_ermitteln) if (!result) then Fehlermeldung(107); Grüße, Frederic |
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
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 |
DP-Maintenance
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Hat definitiv mit Delphi zu tun. Nix allgemein ;-) |
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
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 :zwinker:
Delphi-Quellcode:
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
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;
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; |
Re: Eine Funktion der DLL erzeugt einen Fehler beim Schließe
Zitat:
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 Uhr. |
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 by Thomas Breitkreuz