
Erhalte bei der verwendung von Interfaces und nachfolgenden Units die Meldung
Code: Alles auswählen
Test.lpr(1,1) Fatal: Can't find unit Interfaces used by Test
Code: Alles auswählen
Test.lpr(1,1) Fatal: Can't find unit Interfaces used by Test
Ja, Modal funktioniert nicht. Das habe ich bei mir auch nur verwendet, damit auf das Beenden des Forms gewartet wird, bevor FreeAndNil zuschlägt. Inzwischen hab ich die DLL noch ein wenig erweitert:MmVisual hat geschrieben:Ich habe hier einen Trick. Jetzt ist die Form echt Modal.
Der Haken: Wenn die EXE beendet wird, kommen gaaanz viele Adressen mit Zugriffsverletzung.
Code: Alles auswählen
procedure ShowText(AText: String); stdcall;
begin
if not Assigned(Form1) then begin
try
Form1 := TForm1.Create(Application);
Form1.Memo1.Text := AText;
Form1.ShowModal;
finally
FreeAndNil(Form1);
end;
end else begin
Form1.Memo1.Text := AText;
Form1.SetFocus;
end;
end;
procedure HideForm; stdcall;
begin
if Assigned(Form1) then
Form1.Close;
end;
exports
ShowText, HideForm;
begin
Application.Initialize;
end.
Grundsätzlich ja, ABER: du kannst/solltest diese Klassen dann nur über einfach DLL-Methoden ansprechen. In meinem Fall wird das Ganze eine Reportingerweiterung für eine Software. Die Nutzdaten werden als Stringparameter (enthält dann eine Reihe von Objekten als JSON serialisiert) an eine Prozedur GenerateReport übergeben. Die erstellt dann das Form, die Reportkomponenten, deserialisiert die Daten, erzeugt aus den Objekten den Report und zeigt das Ganze an.khh hat geschrieben:Wenn das mit einem Formular funktioniert, sollte es ja auch möglich sein andere Klassen in DLLs auszulagern, oder ?
Code: Alles auswählen
Initialization
Begin
DLLHandle := 0;
slDllFunctions := TStringList.Create;
End;
Finalization
Begin
//UnLoadDLL(); // <<< Die Zeile mit CloseHandle(DLLHandle); drin
slDllFunctions.Free;
End;
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
type
TMyProc = procedure (AText: String);stdcall;
var
DllHandle: TLibHandle;
MyProc: TMyProc;
begin
try
DllHandle := LoadLibrary('server.dll');
MyProc := TMyProc(GetProcedureAddress(DllHandle, 'ShowText'));
MyProc('Blubb');
finally
UnloadLibrary(DllHandle);
end;
end;
Nein, CloseHandle() kann zwar eine ganze Menge Handle-Typen bearbeiten, aber keine Bibliotheken. Das geht bei Windows mit der Funktion FreeHandle(). Vergleiche in der MSDN-Deklaration auch die unterschiedlichen Typen HANDLE und HMODULE.MmVisual hat geschrieben:Was macht das "UnloadLibrary"?
Bei Windows müsste dies in der Regel auch die Win API Funktion CloseHandle(THandle); aufrufen. Ein UnloadLibrary() habe ich nicht.