Einzelnen Beitrag anzeigen

1234588

Registriert seit: 14. Jan 2007
Ort: Stuttgart
164 Beiträge
 
#7

Re: Hostanwendung mit Plugins

  Alt 15. Aug 2007, 22:37
ich hab mir neulich auch was einfallen lassen muessen.
zuerst such ich mir alle dll's aus einem ordner zusammen. dann suche ich mit MSDN-Library durchsuchenGetProcAddress() 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.
  Mit Zitat antworten Zitat