2010-12-13 4 views
3

In C++, ist es möglich für eine DLL auf einige Symbole der Anwendung, die es geladen? Ich habe eine Anwendung, laden Plug-Ins (Dll), und diese Plug-Ins müssen auf einige API der Anwendung zugreifen.eine DLL muss Symbole seiner Anwendung zugreifen

Ist es möglich, dies zu erreichen, ohne eine neue DLL zu erstellen, die diese API teilen?

Ist eine Struktur von Funktionszeigern in dieser Situation geeignet?

Beispiel: Eine bool Log (char *) - Funktion, die in der Host-Anwendung definiert ist, und ein Plug-in, das einige Ereignisse protokollieren muss.

Antwort

2

Eine weitere Abstimmung für die Übergabe einer Callback-Schnittstelle an die Plug-in-DLL. I.e. die Callback-Schnittstelle ...

class IHostApplication 
    { 
    public: 
    virtual bool Log(const wchar_t* ip_log_string) = 0; 
    }; 

Die DLL-Plugin-Schnittstelle

class IPlugin 
    { 
    public: 
    virtual void InitializePlugin(IHostApplication *ip_host) = 0; 
    }; 

Gastgeber das Plugin-DLL (dynamisch, falls erforderlich), und übergeben sich dann als IHostApplication * an das Plugin geladen werden würde , um einen beliebigen Rückruf zu ermöglichen.

+2

+1, aber ist es eine gute Wahl, eine Plugin-Architektur auf C++ zu erstellen? Das Plugin muss mit dem gleichen C++ Compiler erstellt werden (wenn nicht Version dann mindestens Hersteller). –

+0

Sie können immer "C" öffnen, wenn Sie so geneigt sind - was Sie natürlich auf C-Style-Funktionsschnittstellen beschränkt, aber das ist der Kompromiss. Ich würde COM vorschlagen, aber ich kann das nicht mit einem klaren Gesicht tun :) –

1

Es ist möglich, aber Ihre Designauswahl ist fraglich.

Eine EXE kann Funktionen auf die gleiche Weise exportieren wie eine DLL, sodass Sie GetProcAddress auf die Weise verwenden können, mit der Sie vertraut sind.

Allerdings, warum haben Sie es so konzipiert, dass Plugins müssen Sie etwas über die internen Funktionen des Host-Programms wissen? Es sollte umgekehrt sein.

Der Host sollte verlangen, dass Plugins eine Reihe von Routinen implementieren (die sie exportieren), die sich an einen bestimmten Vertrag halten. Als Teil ihrer Schnittstelle könnte der Host ihnen hostspezifische Informationen in einem Zeiger auf eine Struktur (z. B. Versionsinformationen, Fähigkeiten) und dergleichen übergeben, falls erforderlich.

Die Plugins sollten nicht versuchen, Funktionszeiger auf das Hostmodul zu erhalten.

+0

Wo ist der Schaden? Ein Plugin muss sich sowieso an einen ganz bestimmten Vertrag halten und wird wahrscheinlich nicht funktionieren, wenn jemand außer der Host-App es lädt. Ich kann nicht viel Schaden sehen, wenn die ausführbare Datei auch einige Symbole exportiert, die die Plugins aufrufen können. –

0

Callback-Funktionszeiger, Liste von Callback-Funktionszeigern oder Zeiger auf Callback-Schnittstelle - ich würde eine dieser Optionen verwenden. Dll-Client muss Callback-Schnittstelle implementieren und Zeiger auf diese Schnittstelle zu dynamisch erstellten Dll übergeben. Dynalisch erstellte Dll behält diesen Zeiger und ruft bei Bedarf seine Funktionen auf, um beispielsweise einige Ereignisse zu melden.

Verwandte Themen