Widze, ze nie dostales zbyt ciekawych odpowiedzi, wiec napisalem cos co powinno pomoc ci ogarnac twoj problem.
//plugin
typedef struct //inicjalizacja plugina //connect
{
GUID ID;
char serv[128];
char pswd[128];
int port;
//...
}TInitData;
typedef struct //wiadomosc wysylana
{
GUID IDto;
GUID IDfrom;
char msg[256];
//...
}TMsgData;
typedef struct //komunikat powiadomienia
{
int ID;
int size;
int flags;
void *pData;
}TNotifyData;
//typ powiadomienia
enum NotifyID
{
REC_MESS =0,
USER_QUIT,
USER_ENABLED,
USER_STATUS_CHANGE
//...
};
//aby wszystkie implementacje funkcji notify (callbackowe), mozna bylo zamknac w klasach
class CNotify {};
typedef struct
{
CNotify* notObj;
int (CNotify::*notFunc)(TNotifyData *pData);
}TNotify;
class CPlugin
{
public:
CPlugin(){};
virtual ~CPlugin(){};
protected:
virtual void SetNotifyFunc(TNotify Notify) = 0;
virtual bool Connect(TInitData *pData) = 0;
virtual bool Disconnect(/*...*/) = 0;
virtual bool SendMess(TMsgData* pData) = 0;
TNotify m_Notify;
};
class CGGPlugin : public CPlugin
{
public:
CGGPlugin(){};
virtual ~CGGPlugin(){};
void SetNotifyFunc(TNotify Notify){
m_Notify = Notify;
}
//implementacje zalezne od rodzaju plugina
bool Connect(TInitData *pData);
bool Disconnect(/*...*/);
bool SendMess(TMsgData* pData);
};
powyzsze bedziesz mial w dll, teraz ja sobie wczytujesz i uzyce tego jest takie:
class CController : public CNotify
{
public:
int HandleNotify(TNotifyData *pData);
};
//funkcja callbackowa przyjmujaca rozne komunikaty
int CController::HandleNotify(TNotifyData *pData)
{
switch(pData->ID)
{
case REC_MESS: //przyslana wiadomosc
{
TMsgData *pMsg = reinterpret_cast<TMsgData*>(pData->pData);
// AddTextToWindow(pMsg->IDfrom,pMsg->msg);
// wyswietlenie jej w okienku lub ine operacje
// o ktorych plugin nie musi wiedziec
}
}
//case USER_QUIT: uzytkownik wylaczyl klienta
//case USER_ENABLED: uzytkownik udostepnil sie
//...
return 0;
}
//...
CController ctrl;
CPlugin* plug = new CGGPlugin; //tutaj mozesz stworzyc obijetnie jaki chcesz plugin
//ustawienie funkcji callbackowej
TNotify notif;
notif.notObj = &ctrl;
notif.notFunc = (int (CNotify::*)(TNotifyData*))ctrl.HandleNotify;
plug->SetNotifyFunc(notif);
plug->Connect(0/*...*/);
//w tym czasie do CController::HandleNotify, beda dochodzily rozne komunikaty
//np o prszyslaniu wiadmosci, zmianie statusu uzytkownika, jego rozlaczeniu sie etc.
plug->Disconnect(/*...*/);
a tak powinien wewnetrze nie dzialac plugin:
(np jakis uzytkownik przyslal wiadomosc)
TNotifyData notifyData;
notifyData.ID = REC_MESS; //typ komunikatu
TMsgData messData;
strcpy(messData.msg,otrzymana_wiadomosc);
notifyData.pData = &messData; //dla typu REC_MESS pData jest wskaznikiem na TMsgData
//wywolanie funkcji callbackowej (zostanie wywlana metoda CController::HandleNotify
(m_Notify.notObj->*m_Notify.notFunc)(¬ifyData);
Jest to rozwiazanie bardzo uniwersalne i elastyczne, gdy juz napiszesz HandleNotify, to mozesz pisac ile chcesz i jakie chcesz pluginy roznych protokolow.
To co napisalem wyzej jest bardzo uproszczone, ale dodasz tam co potrzebujesz i rozwiazanie sie sprawdzi. Takim samym sposobem mozesz pisac pluginy GUI i innych!
PS. Chyba troche przesadzilem z dlugoscia postu