96 lines
2.9 KiB
ObjectPascal
96 lines
2.9 KiB
ObjectPascal
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.
|