deine Theorie stimmt soweit - das ganze habe ich auch schon mal in die Praxis umgesetzt:
Die
DLL exportiert mindestens
SnmpExtensionInit,
SnmpExtensionQuery und
SnmpExtensionTrap und erhält vom Service die Daten per
IPC (z.B. Shared Memory), da sie ja dann in den Prozessraum vom
SNMP-Dienst geladen wird.
Beim Starten des
SNMP-Dienstes ruft derselbe als erstes SnmpExtensionInit auf, so dass die
DLL die Basis-OID und den Trap-Event-
Handle bekannt geben kann. Sofern vorhanden, wird danach SnmpExtensionInitEx aufgerufen, bis diese False retourniert, so dass zusätzliche Basis-OIDs bekannt gegeben werden können.
Später dann, wenn ein
SNMP-Request-PDU vom Netzwerk her den
SNMP-Dienst erreicht, und sich die gewünschten OIDs "unterhalb" einer deiner Basis-OIDs befinden, ruft der Dienst SnmpExtensionQuery auf, um von der
DLL die entsprechenden Variablen-Werte zu erhalten und sendet diese dann per
SNMP zurück zum Client.
Möchte die
DLL einen
SNMP-Trap absetzen, so wird der Trap-Event gesetzt, worauf der Dienst dann SnmpExtensionTrap der
DLL aufruft, bis False retourniert wird, um so alle pendenten Traps "abzuholen".
Besonderes Augenmerk ist auf das Memory-Handling zu richten: teilweise behält die
DLL die Verantwortung zum Freigeben von Speicher, teilweise übernimmt dies jedoch auch der
SNMP-Dienst. Da der
SNMP-Dienst typischerweise lange läuft, sollten Memory-Leaks vermieden werden, da sonst irgendwann das Memory vollläuft.
Die erlaubten Communities/Client-Hosts sowie die Trap-Verteilerliste wird zentral vom
SNMP-Dienst verwaltet.