Erzeugen und Einbinden von DLLs
-
- Registered: Dec 24, 2008
- Last visit: Feb 05, 2010
- Posts: 15
Hallo zusammen,
ich versuche erfolglos eine DLL zu schreiben und die darin enthaltene Prozedur in einem Hauptprogramm aufzurufen. Hier der Quellcode des Beispiels:
library testdll;
uses Dialogs;
procedure DllMessage;
begin
ShowMessage('Hello world from a WDSibyl DLL') ;
end;
exports DllMessage index 1;
begin
end.
und das Hauptprgramm:
Unit FORM1;
Interface
Uses
Classes, Forms, Graphics, Buttons;
Type
TForm1 = Class (TForm)
Button1: TButton;
Procedure Button1OnClick (Sender: TObject);
Private
{Insert private declarations here}
Public
{Insert public declarations here}
End;
Var
Form1: TForm1;
Implementation
procedure DLLMessage ; external 'testdll' index 1;
Procedure TForm1.Button1OnClick (Sender: TObject);
Begin
dllmessage
End;
Initialization
RegisterClasses ([TForm1, TButton]);
End.
Programm und DLL werden erzeugt, das Prgramm startet, aber beim Klick auf Button1 gibt es dann eine Exception. Ich habe alles erdenkliche probiert, sieht jemand, was daran oberfaul ist?
Vielen Dank!
Mit freundlichen Grüßen
Peter Engels -
- Registered: Dec 04, 2006
- Last visit: Oct 31, 2012
- Posts: 92
Hallo Peter!
Gleich als erstes:
Willkommen im Forum.
Bzgl. dem Problem:
Mir sieht es so aus, als würde in dem Hauptprogramm der Befehl „Imports“ bzw. „End“ fehlen.
Code
imports
procedure DLLMessage ; external 'testdll' index 1;
end;
lg
Wolfgang
-
- Registered: Dec 24, 2008
- Last visit: Feb 05, 2010
- Posts: 15
Hallo Wolfgang,
das hatte ich auch schon ohne Erfolg probiert. Dann muss aber das Schlüsselwort external entfernt werden, sonst meckert er den DLL-Namen an. Mir scheint, das Imports - END; und external Alternativen. Es gubt auch noch die Möglichkeit dem Prozedurnamen in der DLL exports hinzufügen. Das wird alles anstandslos übersetzt und gestartet, beim Klick auf den Button zum Aufruf der DLL schmiert das Programm dann aber hoffnunglos ab. Der Debugger ist für mich auch keine Hilfe. -
- Registered: Dec 04, 2006
- Last visit: Oct 31, 2012
- Posts: 92
Hallo Peter!
Ich habe mir jetzt auch ein Testprojekt erstellt. Jetzt weiß ich auch warum Deine Verusche nicht funktioniert haben. Das Problem liegt an "ShowMessage", denn diese ist in den SPCC-Librarys definiert und braucht dadurch einiges an Informationen
Wenn Du jetzt folgendes probiertst für die DLL:
Code
library TestDll;
uses WinCrt;
procedure DllMessage;
begin
Writeln('Hello World');
end;
{$IFDEF OS2}
exports DllMessage index 1;
{$ENDIF}
{$IFDEF Win32}
exports DllMessage name 'dllmessage';
{$ENDIF}
begin
end.
Im Hauptprogramm:
Code
.
.
.
Implementation
imports
{$IFDEF OS2}
procedure DLLMessage; 'testdll' index 1;
{$ENDIF}
{$IFDEF Win32}
procedure DLLMessage; 'testdll' name 'dllmessage';
{$ENDIF}
end;
Procedure TForm1.Button1OnClick (Sender: TObject);
begin
dllmessage;
End;
.
.
.
Dann müsste es für OS/2 und Windows funktionieren.
Bei dem Beispiel wird das WinCrt-Fenster aufgemacht und es wird der Text "Hello World" ausgegeben.
lg
Wolfgang
- Moderated by:
- Admins-Forum
Users on-line
- 0 users
This list is based on users active over the last 30 minutes.