Salve.
Ho un piccolo problema per il quale chiedo un consiglio.
Supponiamo di avere una classe base di questo tipo:
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:class IPlugin { public: virtual void Init() = 0; virtual void Work() = 0; virtual const char* GetModuleName() = 0; };
Nel programma host ho poi richiamato il tutto usando una cosa del generecodice:#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(); }
Quello che però avevo in mente è un pò diverso e credo richieda l'utilizzo di più pattern.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; }
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.

Rispondi quotando
