' schrieb:Das kann nicht sein.
Die DLL muss so konstruiert werden, dass die immer einen aktuellen Status liefern kann. Wenn die DLL beendet - sprich mit der Holzhammermethode abgebrochen - werden soll, so kann man auch hierfür in die DLL eine Funktionalität einbauen.
Alles andere, besondern das brachiale Aus-Dem-Speicher-Entfernen, halt ich nicht für gut.
Wenn du die DLL per VI-Beenden abbrichst, kann das sehr lange bis unendlich dauern. Jenachdem wie tief die DLL im Betriebssystem gerade mit irgendwelchen Handles hängt.
Die einzige Weise um eine nicht kooperative DLL aus dem Speicher zu werfen ist den ganzen Prozess zu terminieren. LabVIEW selber kann da gar nichts tun. Solange die DLL hängt kann LabVIEW diese nicht beenden.
Du könntest in LabVIEW 8.2 und neuer die Callback Feature (meiner Meinung nach ein falsch gewählter Name da es sich mehr um ein asynchrones Management interface handelt) der Call Library Node verwenden. Dazu musst Du extra Funktionen in der DLL implementieren die Du als Synchronisationsfunktionen in die Callbackkonfiguration der Call Library Node einfügst. Die Reserve Funktion wird aufgerufen bevor die eigentlich Funktion aufgerufen wird. Hier kannst Du einen Pointer zurückgeben zu einer Struktur in der du jedwelche beliebige Information abspeicherst. Die Unreserve Funktion wird aufgerufen nachdem die Funktion beendet ist und hier kannst Du den Callstack zu Deiner DLL Funktion entfernen und auch eventuel während der Reserve Funktion angelegte Resourcen freigeben.
Die Abort Funktion wird aufgerufen, ja genau!! wenn Du die LabVIEW Hierarchy die die Call Library Node enthält abbrichst währenddem LabVIEW die entsprechende DLL Funktion am Aufrufen ist. Hier wirst Du also ganz einfach aus dem InstancePointer heraussuchen müssen was Du denn so eventuel an Resourcen in der DLL geöffnet hast (oder diese in einer DLL internen global speichern müssen aber dann bitte mit einem Semaphore geschützt wegen Multithreading) und diese entsprechend forciert abbrechen.
Wie abbrechen??? Tja das hängt von der DLL/Library ab die Du hier aufrufst. Das VISA API ist zum Beispiel so intelligent, dass wenn Du eine Session abschliesst mit Close wo noch ein Read am warten ist, dass das Read sich netterweise mit einem entsprechenden Fehler beendet. Das bedingt aber dass Dein API Multithreading safe ist und auch auf so eine Weise funktionieren kann. Ob das Deine CAN Library kann ist noch die grosse Frage!
Rolf Kalbermatter