Announcement

Collapse
No announcement yet.

Funktionstyp als Parameter

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Funktionstyp als Parameter

    Hallo Zusammen,

    ich möchte meherere Procedures bzw. Functions in einer DLL ablegen, die dynamisch eingebunden werden soll.

    procedure Procedure001(aInteger: integer);
    procedure Procedure002(aString: string);

    Die Poceduren in der DLL werden mit folgenden Poceduren im Hauptprogramm aufgerufen:

    procedure CallProcedure001(aInteger: integer);
    var
    DLLHandle: THandle;
    FuncPtr: TFarProc;
    ThisProcedure: procedure(aInteger: integer);
    begin
    DLLHandle:=LoadLibrary(PChar(DLLFileName));
    FuncPtr:=GetProcAddress(DLLHandle,PChar(ProcedureN ame));
    if FuncPtr<>nil then
    begin
    @ThisProcedure:=FuncPtr;
    ThisProcedure(aInteger);
    FuncPtr:=nil;
    end;
    FreeLibrary(DLLHandle);
    end;

    procedure CallProcedure002(aString: string);
    var
    DLLHandle: THandle;
    FuncPtr: TFarProc;
    ThisProcedure: procedure(aString: string);
    begin
    DLLHandle:=LoadLibrary(PChar(DLLFileName));
    FuncPtr:=GetProcAddress(DLLHandle,PChar(ProcedureN ame));
    if FuncPtr<>nil then
    begin
    @ThisProcedure:=FuncPtr;
    ThisProcedure(aString);
    FuncPtr:=nil;
    end;
    FreeLibrary(DLLHandle);
    end;

    Die Proceduren CallProcedure001 und CallPracedure002 unterscheiden sich ja kaum. Deshalb möchte ich, sie zu einer einzigen zusammenzufassen.

    Dabei wäre es notwendig, den Typ der aufgerufenen DLL-Pocedure als Parameter zu übergeben.

    Leider weis ich nicht, ob das geht und wie man das mach.

    Danke für Eure Hilfe.

  • #2
    Erstens sollte man Funktionen in einer DLL mit stdcall Calling Convention versehen.
    Zweitens sollte man die VCL und string meiden, da sonst die DLL Delphi-spezifisch wird und nur mit dem Einbinden von ShareMem laeuft.

    Ich habe mal eine API-Konversion beigefuegt, die zeigt wie man eine Funktion dynamisch laedt.
    Anmerkung: Das der volle Pfadname der DLL benutzt wird ist ungewoehnlich und nur fuer diese spezielle DLL noetig

    Comment


    • #3
      Hallo Robert,
      vielen Dank für Deine Anmerkung. Leider wird meine Frage nicht wirklich beantwortet, die das lautet: Kann man einen Funktionstyp (z.B. THallo = function(aInteger: integer)) als Parameter übergeben

      Comment


      • #4
        Nein, aber man braucht es ja auch garnicht. Die Konversion zeigt wie man die DLL-Funktion einer Variablen zuweist. Danach kann man die Variable wie eine gewoehnliche Funktion benutzen

        Comment

        Working...
        X