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