Hallo,
ich hab mal noch ein wenig rumgestöbert und musste feststellen, dass ich nicht der einzige mit diesem Problem bin.
Nochmal das Problem in Kurzform:
Fehlermeldung "Ungültiger Zugriff auf einen Speicherbereich" nachdem VI geöffnet wurde und erfolgreich lief, anschließend geschlossen wurde und später erneut geladen werden soll.
In folgenden zwei Links wird das selbe Problem beschrieben und auch gleich eine Erklärung inklusive Lösung besprochen. Allerdings verstehe ich nur Bahnhof... Liegt weniger an meinen Englischkenntnissen, sondern wohl mehr an meinem oberflächlichen LabVIEW-Wissen.
Hab zu jedem Link auch gleich die Lösung des Problems herauskopiert, damit ihr nicht erst die ganze Diskussion lesen müsst...
Link 1
Erklärung/Lösung:
It relates to our dll structure. We create a message pump in the dll associated with a hidden window. When the dll is initialized, the window is registered with the operating system. When the dll is unloaded, the window is closed but we weren't de-registering it. This caused the problem the second time the dll was loaded. By de-registering when the dll is unloaded, the problem has been solved.
Link 2
Erklärung/Lösung 1:
The problem was threading. LabVIEW does not currently have the capability to handle multithreaded DLLs properly. The calling application would create a thread, run the DLL, then destroy the thread. When it was run again, the thread creation process was not able to proceed as it should have.
Erklärung/Lösung 2:
DLLs created by LV need a number of resources to carry out execution. The problem here is that the first time LV is called, the thread it is called with will be adopted as its UI thread. The LV execution system will create windows in that thread, and if the thread is later destroyed, it will cripple the LV execution system since it cannot have anything execute in the UI thread. This is why some VIs will work fine while others will not.
If the rest of your app relies on this create/call/destroy architecture, just make sure that the first call or th
e LoadLib is in a different thread that satisfies these requirements. You can then make the DLL calls in any thread that you like and destroy them any way that you like.
Was ist hier mit "Thread" gemeint, und was stimmt mit dem nich?
So ungefähr versteh ich das Problem jetzt ein bisschen, aber ich hab nicht den Hauch einer Ahnung wie ich mit dem Wissen das Problem jetzt umgehen kann...
Danke schonmal im Voraus und Sorry für den vielen Text...
PS: Ein Bildchen vom Blockdiagramm würde euch bestimmt gefallen... Hole ich nach, sobald ich im Labor bin