Einzelnen Beitrag anzeigen

NetSonic

Registriert seit: 10. Mai 2007
124 Beiträge
 
Delphi 10 Seattle Professional
 
#1

DLL verursacht Zugriffsverletzung in MDI-Anwendung

  Alt 7. Jun 2007, 12:52
Ich habe folgendes Problem:

Ich binde eine DLL mit Windows API-Funktionen in eine Anwendung, die nur aus einem Hauptformular besteht wie folgt ein:

Delphi-Quellcode:
implementation

{$R *.DFM}

//Ansterungsfunktionen aus DLL
function StartWatchdog(Timeout: PChar): Boolean; stdcall; external 'wdt_io_dll.dll';
function StopWatchdog(): Boolean; stdcall; external 'wdt_io_dll.dll';
function RestartWatchdog(): Boolean; stdcall; external 'wdt_io_dll.dll';
function IO_Write(Value: PChar): Boolean; stdcall; external 'wdt_io_dll.dll';
function IO_Read(): PChar; stdcall; external 'wdt_io_dll.dll';

Der Aufruf erfolg z.B. mit dieser Funktion:

Delphi-Quellcode:
procedure TfrmMain.btnWriteClick(Sender: TObject);
begin
     if (IO_Write(PChar(txtOutput.Text)) = false) then
     begin
          MessageDlg('Fehler, kein (gültiges) Handle!', mtWarning, [mbOK], 0);
     end;
end;
Das klappt auch wunderbar. Nun habe ich noch eine Anwendung, die als MDI-Applikation erstellt wurde. Von einem dieser Child-Fenster, die im laufenden Betrieb erzeugt werden, möchte ich nun auch diese Funktionen aus der DLL nutzen. Das ganze habe ich wie folgt in das MDI-Child eingebunden:

Delphi-Quellcode:
implementation

uses frmMainUnit;

{$R *.DFM}

//Ansterungsfunktionen aus DLL importieren
function StartWatchdog(Timeout: PChar): Boolean; stdcall; external 'dll\wdt_io_dll.dll';
function StopWatchdog(): Boolean; stdcall; external 'dll\wdt_io_dll.dll';
function RestartWatchdog(): Boolean; stdcall; external 'dll\wdt_io_dll.dll';
function IO_Write(Value: PChar): Boolean; stdcall; external 'dll\wdt_io_dll.dll';
function IO_Read(): PChar; stdcall; external 'dll\wdt_io_dll.dll';
(Die DLL liegt im Unterordner "dll" im Programmverzeichnis, Pfadänderungen beheben das Problem auch nicht!)
und rufe es so auf...

Delphi-Quellcode:
procedure TfrmRun.btnEinzelbetriebClick(Sender: TObject);
begin
     //Spannung einschalten
     if (IO_Write(PChar('2')) = true) then
     begin
          imgSpannung.Picture.LoadFromFile(ExtractFileDir(Application.ExeName) + '\sys\led_green.jpg');
     end
     else begin
          imgSpannung.Picture.LoadFromFile(ExtractFileDir(Application.ExeName) + '\sys\led_red.jpg');
          StatusLogWrite('Keine Spannung auf dem Kreis!', 'Info');
     end;
     Application.ProcessMessages;
     //Signal einschalten
     if (IO_Write(PChar('4')) = true) then
     begin
          imgSignal.Picture.LoadFromFile(ExtractFileDir(Application.ExeName) + '\sys\led_green.jpg');
     end
     else begin
          imgSignal.Picture.LoadFromFile(ExtractFileDir(Application.ExeName) + '\sys\led_red.jpg');
          StatusLogWrite('Kein Signal auf dem Kreis!', 'Info');
     end;
end;
Jedoch bekomme ich immer eine Zugriffsverletzung und die "IO_Writes" werden nicht ausgeführt, obwohl die Anwendung sonst gut läuft und ich die Einbindung von der oberen Anwendung übernommen habe. Liegt das evtl. daran, dass ich MDI-Childs nutze? Gibt es da besonderheiten beim Einbinden von DLL's?

Gruß, NetSonic
  Mit Zitat antworten Zitat