ich hab mir neulich auch was einfallen lassen muessen.
zuerst such ich mir alle
dll's aus einem ordner zusammen. dann suche ich mit
GetProcAddress() meine funktion xy (je nach dem wie du sie nennen moechtest) in jeder
dll. ist sie vorhanden wird die addresse bzw. der funktionspointer in ein dynamisches array geschrieben. (falls die addresse nil ist, also die funktion nicht vorhanden, kann ich davon ausgehen das es kein geeignetes plugin ist).
mein array mit den addressen setze ich dann an das ende meiner fenster prozedur und uebergebe meine parameter (hwnd, msg, wparam und lparam), sodass ich mit den plugins direkt in das programm eingreifen kann. meine
dll's sind, wenn man es genau nimmt, eine verlaengerung der fenster prozedur.
das ganze habe ich noch erweitert, um es dem jeweiligen plugin entwickler zu erleichtern.
ich exportiere eine zweite funktion aus dem plugin. falls diese funktion vorhanden ist, wird es wieder einem dynamischen array hinzugefuegt. was aber viel interessanter ist, die funktion gibt einen nullterminierten string zurueck, der dann spaeter einem menu item einen namen geben soll.
gleichzeitig erwartet die funktion einen wert des typs Integer, der als button id dienen soll (es wird verhindert das eine id zweimal vergeben wird, da das 'host' programm durch inkrementieren immer eine einmalige nummer zuweist).
ein beispiel:
unser programm findet die
dll abc.dll, def.dll und ghi.dll. es sucht nun nach den 2 funktionen in jeder
dll (in diesem beispiel hat jede
dll beide funktionen).
nun wird die zweite funktion der
dll's aufgerufen, es passiert folgendes:
abc.dll bekommt nun einen integer vom host programm, angenommen es waere 100.
unser host programm bekommt gleichzeitig einen namen aus der
dll, 'Plugin ABC'.
auch die def.dll bekommt eine button id zugewiesen, da es bei der abc
dll schon 100 ist, muessen wir inkrementieren -> 101.
unser host programm bekommt gleichzeitig einen namen aus der
dll, 'Plugin DEF'.
das selbe spielchen passiert nun mit der ghi.dll. sie bekommt die nummer 103 und gibt den namen 'Plugin GHI' zurueck.
lassen wir jetzt in unserem hauptprogramm unser popupmenu anzeigen, hat es folgende eintraege:
- ABC Plugin
- DEF Plugin
- GHI Plugin
druecken wir nun die 'DEF Plugin' schaltflaeche, erhalten wir von windows die nachricht das der button mit der id 101 gedrueckt wurde. nun kommt unsere erste importierte funktion die wir aus der
dll haben ins spiel. wir geben durch den callback am ende unserer fenster prozedur, die nachricht das der buton 101 gedrueckt wurde, an jede
dll weiter. die entsprechende muss nur noch darauf reagieren.
allerdings ist das nur eine anregung und sehr ausbaufaehig. dennoch ist es fuer meine beduerfnisse ausreichend =)
es ist vielleicht ein wenig grob geschrieben, dennoch denke ich das es relativ verstaendlich ist.