Hallo...
ich darf eine
SNMP Agent Extension
DLL für den MS
SNMP Dienst schreiben. Meine
DLL ist 32 Bit (muss sie sein wegen erforderlicher Komponenten, die
DLL soll unter 64 Bit Win7 bzw. Server 2012R2 eingesetzt werden).
Meine
DLL Exportiert die folgenden Funktionen: SnmpExtensionInit, SnmpExtensionInitEx, SnmpExtensionQuery, SnmpExtensionTrap und SnmpExtensionClose.
In der Theorie soll der
SNMP Dienst beim starten die
DLL laden und SnmpExtensionInit aufrufen. Danach solange SnmpExtensionInitEx bis dieser Call false zurück gibt. Bei einer Abfrage via
SNMP wird dann SnmpExtensionQuery aufgerufen, beim Beenden des Dienstes
SNMP Close
Ich bin jetzt soweit das ich eine
DLL habe die auch vom
SNMP Dienst geladen wird: Direkt nach dem Start wird SnmpExtensionInit aufgerufen (wunderbar) und direkt anschliessend SnmpExtensionClose (schade, schade)
Irgendwas muss also der
DLL an SNMPExtensionInit nicht passen...Die Function sieht so aus:
Delphi-Quellcode:
function SnmpExtensionInit(dwUptimeReference : DWORD;
var phSubagentTrapEvent : THandle;
var pFirstSupportedRegion : PAsnObjectIdentifier): boolean;
stdcall;
export;
Begin
result := False;
// SNMP Controller erzeugen
Controller := TZSNMPController.GetInstance;
phSubagentTrapEvent := CreateEvent(
Nil, False, False,
Nil);
if phSubagentTrapEvent > 0
then
Begin
// Neuen Object Udentifier erzeugen und zurückgeben
New(ObjectIdentifier);
ObjectIdentifier^.idLength := 10;
ObjectIdentifier^.ids :=@ARRAY_MIB_PATH_BASE;
pFirstSupportedRegion := ObjectIdentifier;
// SNMP Controller initalisieren
if Controller.initialize
then
result := Controller.connect;
End;
End;
Die Typen PAsnObjectIdentifier und TAsnObjectIdentifier sind in der JediAPI definiert als:
Delphi-Quellcode:
PAsnObjectIdentifier = ^TAsnObjectIdentifier;
TAsnObjectIdentifier = record
idLength: UINT;
ids: PUINT;
end;
ARRAY_MIB_PATH_BASE ist eine Konstante und definiert ein UINT Array, welche die Base OID der von meiner Extension verwalteten OID's enthält:
ARRAY_MIB_PATH_BASE : Array[ 0 .. 9 ] of UINT =(1, 3, 6, 1, 4, 1, 4711, 1, 1, 1);
Ich habe in Delphi eine 32 Bit Anwendung geschrieben welche die
DLL aufruft, einmal mit
DLL early binding, einmal mit dynamischen
DLL Binding. Alle Funktionen machen das was sie sollen, insbesondere die SnmpExtensionInit gibt auch das Array korrekt zurück.
Was mache ich an der Stelle nur falsch....
Vielleicht hat jemand ja eine Idee....
Liebe Grüsse
Benedikt