Salve.
Ho un piccolo problema per il quale chiedo un consiglio.
Supponiamo di avere una classe base di questo tipo:
codice:
class IPlugin
{
public:
virtual void Init() = 0;
virtual void Work() = 0;
virtual const char* GetModuleName() = 0;
};
Ora voglio che un utente esterno possa estendere tale classe e implementare dei comportamenti opportuni. Per fare quindi una prova al volo, ho scritto una cosa del genere (sono solo delle prove quindi perdonate errori di qualsiasi genere, concentratevi sul concetto):
codice:
#include "stdafx.h"
class IPlugin
{
public:
virtual void Init() = 0;
virtual void Work() = 0;
virtual const char* GetModuleName() = 0;
};
class MyLib : public IPlugin
{
public:
void Init() { OutputDebugStringA("Init ok\n"); }
void Work() { OutputDebugStringA("Run ok\n"); }
const char* GetModuleName() { return "MyLib"; }
};
extern "C" __declspec(dllexport) IPlugin* Create() { return new MyLib(); }
Nel programma host ho poi richiamato il tutto usando una cosa del genere
codice:
#include <Windows.h>
class IPlugin
{
public:
virtual void Init() = 0;
virtual void Work() = 0;
virtual const char* GetModuleName() = 0;
};
typedef IPlugin* (*create)();
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdline, int nCmdShow)
{
create CreateLib;
HMODULE lib = LoadLibraryA("Lib.dll");
CreateLib = (create)GetProcAddress(lib,"Create");
IPlugin *p = CreateLib();
p->Init();
p->Work();
OutputDebugStringA(p->GetModuleName());
delete p;
FreeLibrary(lib);
return 0;
}
Quello che però avevo in mente è un pò diverso e credo richieda l'utilizzo di più pattern.
L'intento è "chiedere" alla DLL quali sono le classi che essa esporta e poi scegliere dal programma host quale implementazione chiedere alla DLL.
Un esempio pratico chiarirà meglio la situazione
Programma host: leggi file .conf
Nel file conf c'è scritto -> carica dll1, dll2 e dll3
Per ogni dll il programma la carica e chiede: "Mi dai la lista delle classi che implementano l'interfaccia Plugin che abbiamo concordato?"
La dll da la lista.
Sempre nel file conf c'è scritto: "Questa cosa devi gestirla con l'implementazione A e quest'altra con l'implementazione Z"
Il programma cerca in quale HMODULE è implementata dale classe e ne chiede un puntatore.
Spero di essere stato chiaro.
Grazie in anticipo per l'aiuto.