Ich bin dabei eine Library als PlugIn zu schreiben. Habe mich durchgegoogelt und hoffe, dass das alles so richtig ist. Jetzt weiß ich nur nicht, was ich meiner Form in der Library für einen Owner übergeben soll. An dieser Stelle möchte ich gleich meinen Code von Euch auf Fehler überprüfen lassen
Code: Alles auswählen
library UI;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, UMain, ULog; // Interfaces ermöglicht visuelle Komponenten, die anderen beiden sind eigene Units, die solche enthalten
{$IFDEF WINDOWS}{$R UI.rc}{$ENDIF}
procedure ShowMain; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} // die Library soll plattformunabhängig sein
begin
if not Assigned(MainForm) then
MainForm := TMainForm.Create(nil); // nil scheint nicht zu funktionieren ->
MainForm.Show; // hier kommt Fehler: "Failed to create win32 control, error: 1407: Fensterklasse wurde nicht gefunden." Ich vermute, es wird versucht das Form im Owner zu positionieren oder so?
end;
exports
ShowMain;
end.Code: Alles auswählen
unit UMain;
{$mode objfpc}{$H+}
interface
... // korrekte Klassendefinition von TMainForm aus einer GUI-Anwendung rüberkopiert, dort getestet und lauffähig
var
MainForm: TMainForm;
implementation
... // Implementierung von TMainForm
initialization
{$I umain.lrs}
finalization
if Assigned(MainForm) then
MainForm.Free; // gegen Speicherlücken ist hier sicherlich der richtige Ort zum freigeben?
end.Code: Alles auswählen
program URSEPlayer;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, FileUtil, CRT, DynLibs, RSELists, UDefines;
{$IFDEF WINDOWS}{$R URSEPlayer.rc}{$ENDIF}
type
TProcedure = procedure; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
...
var
UILib: TLibHandle;
AppDir: String;
ShowMain: TProcedure;
begin
AppDir := ExtractFileDir(ParamStrUTF8(0));
UILib := LoadLibrary(AppDir+PlugInDir+'ui.rpp');
try
Pointer(ShowMain) := GetProcedureAddress(UILib,'ShowMain');
if Pointer(ShowMain) <> nil then
ShowMain; // ohne diese Zeile klappt alles, der Aufruf selbst klappt auch, Fehler siehe library
repeat
until KeyPressed; // damit das Programm nicht gleich zu Ende ist
finally
UnLoadLibrary(UILib);
end;
end.