Komunikacja bibliotek między sobą i aplikacją WinAPI

0

Witajcie. Mam taki nietuzinkowy problem odnośnie dllek. Głowię się jak ja być skonstruowany kod, aby kilka dllek przesyłało między sobą informacje. Screen może nieco rozjaśni mój plan:
68f78644db.png
Czyli mam różne przyciski w różnych dllkach, mechanizm obsługi dźwięków, jakieś dodatki do odtwarzacza. Wszystkie dllki muszą ze sobą współpracować tj. Jak wcisnę przycisk w DLL1, wysyła ona załóżmy komunikat QUESTION_SOUND_STOP do wszystkich innych pluginów. Wtedy np. DLL2 w którym znajduje się obsługa dźwięku wyłącza utwór i wysyła do pluginów SOUND_STOP jeżeli się powiodło. Wtedy inne pluginy wiedzą co robić tj. w DLL1 grafika przycisku z "STOP" zmieni się na "PLAY".

Macie jakiekolwiek wskazówki jak to można skonstruować? Bo ja nie mam bladego pojęcia. Przeraża mnie to, że tych komunikatów może być dużo, więc pewnie trzeba będzie wprowadzić jakąś kolejkę. Co Wy na to? Uzywać tu wielowątkowości czy nie ma sensu?

EDIT:
Będę nawet wdzięczny za wskazówki co wpisać w google, bo dostałem zwiechy mózgu na samą myśl o tym :)

1

Jak wcisnę przycisk w DLL1, wysyła ona załóżmy komunikat QUESTION_SOUND_STOP do wszystkich innych pluginów.

Najlepiej robić to po stronie programu EXE, czyli jeden plugin wysyła komunikat do exeka, w exeku masz listę aktywnych pluginów i rozsyłasz komunikat do wszystkich pluginów.

„wysłanie komunikatu” to uruchomienie eksportowanej funkcji, albo wpisanie czegoś do współdzielonej kolejki, albo coś tego typu..

0

Ja bym zrobił tak, że każda dll'ka może zarejestrować funkcję odpowiedzialną, za obsługę komunikatów. Oczywiście bibliotek może być dużo, więc pewnie była by to jakaś lista funkcji.
Z głównej aplikacji, lub specjalnej dll'ki wyeksportował bym też funkcję odpowiedzialną, za poprawne przekazanie komunikatu do pluginów tzn ta funkcja wywoływała by każdą funkcję z listy z odpowiednim komunikatem.

0

Cos takiego?
c16c9b2e65.png

#include <windows.h>
#include <string>
#include <vector>
using namespace std;

class cPLUGIN{
    public:
        cPLUGIN();
        virtual ~cPLUGIN();
        
    private:

};
class cENGINE{
    public:
        cENGINE();
        ~cENGINE();

        bool LoadPlugin(string sFile);
        bool SendMessage();
    private:
        vector<cPLUGIN> vPlugins;
       
    protected:

}; 

(Kod niepełny, dopiero zaczynam)

W wektorze pluginów będę miał wszystkie pluginy. W metodzie LoadPlugin() będę wywoływał funkcję z wewnątrz dllki Initialize() do której przekażę wskaźnik na funkcję/metodę* obsługującą komunikaty w exe aby dllka wiedziała gdzie ma wysyłać komunikaty oraz pobiorę funkcję/metodę z dllki aby .exe wiedziało, gdzie ma wysyłać komunikaty. Dobre rozwiązanie?

0

@gswidwa, Ty to chyba lubisz sobie życie utrudniać, co? DLL1 kompletnie zbędny, przenieś tworzenie i obsługę okiem do EXEka. DLL2 to główny silnik programu? Jeśli tak, to też do EXEka, bo jaka korzyść z tego, że będzie w DLL-ce?

0 użytkowników online, w tym zalogowanych: 0, gości: 0