DLL-Problem


Twinsetter

Mitglied
Hallo zusammen!

Ich habe für meine Firma ein größeres Programm geschrieben. In diesem Programm sind einige Funktionen in Plugins ausgelagert. Die Plugins sind im Prinzip DLL's die ich in einem speziellen Verzeichnis ablege. Bei Start sucht das Programm alle in diesem befindlichen Dateien (Plugins). Jede gefundene Datei wird hierbei dynamisch geladen und es wird das Vorhandensein einer bestimmten Funktion abgeprüft. Ist diese Funktion vorhanden wird sie aufgerufen. Die Funktion gibt ein Zeichenarray - keinen String (funktioniert in DLL's nicht) - zurück, welches Informationen zum Plugin enthält, die für den weiteren Programmablauf wichtig sind.
Das ganze funktioniert auch recht ordentlich. Leider gibt es in letzter Zeit bei einigen Anwendern Probleme bei dieser Abfrage. Normalerweise dauert die Abfrage pro Plugin zwischen 10-30ms (habe ich durch eine eigebaute Debuggerroutine ermittelt). Bei derzeit 10 Plugins ist diese Prozedur also in ca. 500ms erledigt. Bei einigen Usern dauerte das aber bis zu 30s und in einigen ganz wenigen (3 von 100) Fällen bleibt das Programm an dieser Stelle komplett hängen und muß mit dem Taskmanager beendet werden. Wenn das Programm beendet und danach erneut gestartet wird funktioniert alles perfekt und die Ladezeiten sind wieder völlig normal. Nach einem Windowsneustart geht der Sch... wieder los.
Bei manchen Usern hat eine Restaurierung des Systems zu einem Widerherstellungspunkt geholfen. Das Programm wird schon länger eingesetzt, der Fehler ist aber relativ neu. Auf meinem Entwicklungsrechner tritt der Fehler nicht auf bzw. die Verzögerung beim ersten Programmstart ist sehr kurz. Auch auf anderen PC bei mir mit verschiedenen Systemen von W98 bis Windows 7 tritt dieser Fehler nicht auf. Selbst auf einem Versuchssystem mit Linux und Wine läuft alles einwandfrei.

Hat jemand da eine Idee wo man da suchen könnte. Auf den PC's (i.d.R. Firmenlaptops) läuft XP und Servicepack 2. Könnte das mit dem DLL Caching von Windows oder der Desktopfirewall (McAfee) zusammenhängen ? Die PC's werden komplett durch unsere IT betreut, d.h. Updates, Patches etc. werden automatisch eingespielt sobald man sich mit dem Firmennetz verbindet. Unglücklichereise kann man nicht richtig nachvollziehen was da eingespielt wird - die meisten User wären damit aber auch überfordert.
Die Probleme treten meistens nach solchen Updates auf.

Hat jemand schon ähnliche Probleme gehabt. Bin für jeden Hinweis dankbar. Bekomme bald ne Meise.


Gruß Twinsetter
 

vop

Erfahrenes Mitglied
Könnte es sein, das bei einem solchen Update-Vorgang, bei dem die dlls ersetzt werden sollen, gerade die eine oder andere geladen ist und deswegen nicht überschrieben werden kann?
Vielleicht geht dabei was kaputt?
Lösung wäre hier, vor einem Update sicher zu stellen, dass die 'alten' dlls erst gelöscht werden und geprüft wird, ob das auch wirklich geklappt hat.
 

Twinsetter

Mitglied
Danke für Deine Antwort.

Ich habe aber den Eindruck, daß da bei Dir was nicht richtig angekommen ist. Bei meinem Programm wird nichts geupdatet. Es geht hier um das Einspielen von allgemeinen Systemupdates durch unsere IT, die haben aber primär erst mal nichts mit meinem Programm zu tun.
Mein Programm schreibt an dieser Stelle auch nichts. Es wird lediglich eine ganz simple DLL-Funktion aufgerufen, die Zeichenarrays zurückgibt.
Hier mal der Code der Funktion
Code:
function ModulInfo:TInfo;stdcall;
begin
  StrPCopy(Result.DateiName,DateiName);
  StrPCopy(Result.ModulName,FormularTitel[1]);
  StrPCopy(Result.IDStr,IDStr);
  Result.TypID:=TypID;
  StrPCopy(Result.Copyright,Copyright);
  StrPCopy(Result.Version,Version);
end;
Die Plugins werden ausschließlich von dem Programm benutzt. Es erfolgt also kein Zugriff durch andere Programme.

Gruß Twinsetter
 

vop

Erfahrenes Mitglied
Vielleicht solltest du jeden DLL-Testaufruf in einer Art Timeout-Routine kapseln.
Etwa in einer while - Schleife, die beendet wird, wenn entweder der Funktionsaufruf gelungen ist oder aber spätestens nach n Millisekunden.
Wenn du das ganze noch mit einem Logging versiehst (Timeouts werden protokolliert in der Art xy.dll timeout ) könnte es dir helfen, das Problem zu lösen oder zumindest einzugrenzen.