New account

Erzeugen und Einbinden von DLLs  Bottom

  • 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
  • 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
  • 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.
  • 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
  • 0 users

This list is based on users active over the last 30 minutes.