unit LLVM.Runner; interface uses System.SysUtils, Winapi.Windows, System.Classes; type // Callback-Prozedur, die von der DLL aufgerufen wird TLogIntegerCallback = procedure( AValue: Integer ); stdcall; // NEU: Typ für die Host-Additionsfunktion THostAddIntegersCallback = function( ANum1: Integer; ANum2: Integer ): Integer; stdcall; // NEUE, VEREINFACHTE Signatur der exportierten DLL-Funktion // Jetzt nur noch der Log-Callback und der neue Integer-Input-Parameter TStarteLogikProc = procedure( ALogIntProc: TLogIntegerCallback; AHostInputInteger: Integer; AHostAddIntegersProc: THostAddIntegersCallback // <--- Der neue Host-Unterprogramm-Parameter ); stdcall; type TLLVMRunner = class private FModule: HMODULE; FStarteLogik: TStarteLogikProc; class var FLog: TStrings; class procedure LogInteger( AValue: Integer ); static; stdcall; // NEU: Host-Unterprogramm-Implementierung class function HostAddIntegers( ANum1: Integer; ANum2: Integer ): Integer; static; stdcall; public constructor Create(const ADLLPath: string); destructor Destroy; override; procedure Execute( AInputInteger: Integer ); class property Log: TStrings read FLog write FLog; end; implementation { TLLVMRunner } constructor TLLVMRunner.Create(const ADLLPath: string); begin inherited Create; FModule := LoadLibrary( PChar( ADLLPath ) ); if FModule = 0 then raise Exception.Create( 'Failed to load DLL.' ); FStarteLogik := GetProcAddress( FModule, 'StarteLogik' ); if not Assigned( FStarteLogik ) then raise Exception.Create( 'Procedure "StarteLogik" not found in DLL.' ); end; destructor TLLVMRunner.Destroy; begin if FModule <> 0 then FreeLibrary( FModule ); inherited; end; // NEUE Implementierung der Host-Funktion class function TLLVMRunner.HostAddIntegers( ANum1: Integer; ANum2: Integer ): Integer; begin Result := ANum1 + ANum2; // Die eigentliche Logik if Assigned(FLog) then FLog.Add(Format('DLL hat Host-Addition angefordert: %d + %d = %d', [ANum1, ANum2, Result])); end; // Die Execute-Methode muss angepasst werden, um den neuen Funktionszeiger zu übergeben procedure TLLVMRunner.Execute( AInputInteger: Integer ); begin if Assigned( FStarteLogik ) then FStarteLogik( LogInteger, AInputInteger, HostAddIntegers // <--- Adresse der Host-Funktion übergeben ); end; // Dies ist die Methode, die die DLL für LogInteger aufruft. class procedure TLLVMRunner.LogInteger( AValue: Integer ); begin if Assigned( FLog ) then FLog.Add( Format( 'DLL logged integer: %d', [AValue] ) ); end; // Die Implementierungen von GetCurrentDateTimeUTCHost und GetComponentInZoneHost // wurden hier entfernt, da sie nicht mehr benötigt werden. end.