Einzelnen Beitrag anzeigen

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, 13: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