2017-10-16 6 views
1

Ich moduliere meine Anwendung mit separaten Modulen (Plugin) zu arbeiten.Funktion EXE zu DLL (Delphi)

Ich habe bereits erfolgreich meine EXE-Anwendung lesen und laden Sie die Plugins, einschließlich der Formulare.

Jetzt muss ich die inverse, exportieren Sie die Funktionen von der ausführbaren in DLL.

Beispiel: In meiner ausführbaren Datei befindet sich eine TMemo-Komponente. Ich möchte eine Funktion wie diese

function GetMemo(): widestring; 

In meiner Idee schaffen, wer auch immer die DLL-Plugin geschrieben, wenn die Funktion GetMemo() aufrufen, würde bereits den Inhalt der TMemo in DLL nehmen.

Es ist möglich?

+0

Der Verbraucher Ihrer Anwendung würde ziemlich viel Arbeit zu tun. Stellen Sie Ihr Formular besser in eine DLL. – Victoria

+0

Sicher ist das möglich. Ausführbare Dateien können Funktionen exportieren. Es könnte jedoch besser sein, den Plugins eine COM-Schnittstelle zur Verfügung zu stellen. Design mit so wenig Informationen schwer zu führen. –

+0

Entweder verwenden Sie native Delphi-Typen und schreiben BPLs, wie Delphi selbst geschrieben ist, oder bleiben Sie beim Microsoft COM-Standard, aber es würde zusätzliche Tools wie externe Typen (Schnittstellen) benötigen. –

Antwort

3

Die einfachste Möglichkeit, dies zu handhaben, besteht darin, eine Aufzeichnung von Funktionszeigern zu definieren und dann die EXE eine Instanz dieses Datensatzes an jedes Plugin übergeben zu lassen, während es initialisiert wird. Die EXE kann dann die Funktionen nach Bedarf implementieren und sie an die Plugins übergeben, ohne sie tatsächlich wie eine DLL aus der PE-Exporttabelle zu exportieren.

Zum Beispiel:

type 
    PPluginExeFunctions = ^PluginExeFunctions; 
    PluginExeFunctions = record 
    GetMemo: function: WideString; stdcall; 
    ... 
    end; 

function MyGetMemoFunc: WideString; stdcall; 
begin 
    Result := Form1.Memo1.Text; 
end; 

... 

var 
    ExeFuncs: PluginExeFunctions; 
    hPlugin: THandle; 
    InitFunc: procedure(ExeFuncs: PPluginExeFunctions); stdcall; 
begin 
    ExeFuncs.GetMemo := @MyGetMemoFunc; 
    ... 
    hPlugin := LoadLibrary('plugin.dll'); 
    @InitFunc := GetProcAddress(hPlugin, 'InitializePlugin'); 
    InitFunc(@ExeFuncs); 
    ... 
end; 

var 
    ExeFuncs: PluginExeFunctions; 

procedure InitializePlugin(pExeFuncs: PPluginExeFunctions); stdcall; 
begin 
    ExeFuncs := pExeFuncs^; 
end; 

procedure DoSomething; 
var 
    S: WideString; 
begin 
    S := ExeFuncs.GetMemo(); 
    ... 
end; 
+0

Bitte, wie kann ich auf Google suchen, um herauszufinden mehr zu diesem Thema? –

+0

Danke Remy Lebeau! –

+0

Dieser Block PPluginExeFunctions =^MyFunctions; Die "MyFunction" ist GetMemo? –