| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Bechtle stärkt PLM-Geschäft mit Neugründung |
Autor
|
Thema: API: Verbindung zu SWX verloren (1272 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Sep. 2004 09:36 <-- editieren / zitieren --> Unities abgeben:
Ich schon wieder... Ich habe bei mir folgendes Phänomen: Ich habe diverse VB-Programme, die nach dem Schema Code: ... Set swApp = CreateObject("SldWorks.Application") Set Drw = swApp.ActiveDoc If (Drw Is Nothing) Then 'Keine Zeichnung geöffnet! MsgBox No_Drawing, vbCritical GetDrawing = False Exit Function End If If (Drw.GetType <> swDocDrawing) Then 'Dok ist keine Zeichnung! MsgBox No_Drawing, vbCritical GetDrawing = False Exit Function End If ...
die Verbindung zu SWX herstellen und prüfen, ob gerade eine Zeichnung geöffnet ist. Klappt soweit ja prima, nur: Wenn in diesem Moment SWX nicht läuft, bekomme icherst mal richtigerweise die Fehlermeldung "Keine Zeichnung geöffnet". Aber: Dann geht irgendwie der ganze Mechanismus, nach dem die Verbindung hergestellt wird, den Bach hinunter. Wenn ich SWX nun starte, eine Zeichnung öffne und das Programm wieder starte, erhalte ich wieder die Meldung "Keine Zeichnung!". Da hilft nicht mal ein Ab- und Anmelden, sondern nur noch ein Neustart, dann funktioniert alles wieder. Diesen Effekt habe ich sowohl bei mir mit Win2000 als auch bei Kollegen mit WinXP. Steckt da irgendein Wurm in meinem Code? Oder ist das immer so? Gruß ------------------ Klaus Massler www.al-ko.de privat... ForumsChat: Schau doch mal hier rein, wenn ihr Zeit habt... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 28. Sep. 2004 10:27 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Klaus, ich vermute mal die Ursache in deinem Code, aber das ist mit den Schnipseln nur schwer zu sagen. In jedem Fall solltest du mal schauen, wie viele SolidWorks-Prozesse so auf deiner Maschine laufen ... vielleicht klinken sich deine Programme immer an den falschen Prozess. In jedem Fall wird ja mit dem CreateObject("SldWorks.Application") ein neuer Prozess aufgemacht, wenn das Programm keinen findet, und der hängt dann u.U. unsichtbar im Speicher rum. Allerdings sollte das durch Ab- und Anmelden zu kurieren sein, scheint also noch etwas anderes zu sein Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de KLAMM? Was ist KLAMM? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Sep. 2004 11:09 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, Zitat: Original erstellt von StefanBerlitz: ...ich vermute mal die Ursache in deinem Code, aber das ist mit den Schnipseln nur schwer zu sagen...
mehr als diese Schnipsel laufen nicht ab, wenn keine Zeichnung offen ist. Das mit dem SWX-Prozess war ein guter Hinweis, es wird wirklich ein neuer SolidWorks-Prozess gestartet, ohne dass SWX wirkich los legt. Wenn ich den im Taskmanager lösche, kann ich mir den Neustart sparen. Die Frage ist dann natürlich: wie mache ich das besser? Der Code aus dem Macro-Recorder "Set swApp = Application.SldWorks" funktioniert ja in VB6 nicht. Oder wie kann ich feststellen, ob SWX überhaupt läuft? Ciao ------------------ Klaus Massler www.al-ko.de privat... ForumsChat: Schau doch mal hier rein, wenn ihr Zeit habt... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Kalle Mitglied Student
Beiträge: 706 Registriert: 14.04.2002
|
erstellt am: 28. Sep. 2004 11:11 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Aheu Klaus, wenn SolidWorks schon läuft klinkst Du Dich an die laufende Version mit set swApp = GetObject(, "SldWorks.Application") an. Nachteil dieser Methode ist allerdings, dass es einen Laufzeitfehler gibt wenn kein SolidWorks läuft. Dummerweise (zumindest bei mir) kann man diesen Fehler auch mit On Error Resume Next nicht umgehen. Der meckert trotzdem rum dass eine Objekterstellung duch eine ActiveX-Komponente nicht möglich ist - oder so ähnlich. Bis dann, Kalle Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Sep. 2004 11:18 <-- editieren / zitieren --> Unities abgeben:
|
Kalle Mitglied Student
Beiträge: 706 Registriert: 14.04.2002
|
erstellt am: 28. Sep. 2004 11:21 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Sep. 2004 11:26 <-- editieren / zitieren --> Unities abgeben:
|
Andreas Müller Mitglied Masch. Ing. HTL / Betriebsing. STV
Beiträge: 1151 Registriert: 11.04.2001
|
erstellt am: 28. Sep. 2004 11:47 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Klaus. Ich vermute wie Stefan, dass wenn kein SWX läuft, dein Code ein neues SWX aufmacht. So wie's ausschaut, bleibt dieser Task am Leben, weil Du ihn in den "if then's" nicht wieder schliesst. Er bleibt im Speicher hängen. Ich an Deiner stelle würde den Task wieder schliessen mit swApp.close ( oder so ähnlich) Auf jeden Fall solltest Du die zugewiesenen Object's wieder aus dem Speicher werfen mit: set Drw = Nothing set swApp = Nothing z.B. kannst Du ja eine Sub "SchliesseAlleObjects" schreiben und diese vor jedem Verlassen des Macro's aufrufen. Ansonsten kann es u.U. zu ganz "komischen" Dingen kommen. ------------------ Gruss Andreas A+E Müller AG Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Sep. 2004 11:50 <-- editieren / zitieren --> Unities abgeben:
|
Andreas Müller Mitglied Masch. Ing. HTL / Betriebsing. STV
Beiträge: 1151 Registriert: 11.04.2001
|
erstellt am: 28. Sep. 2004 13:28 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hi Alle. Ich muss zugeben, in diesen Regionen bin ich auch nicht ganz sattelfest (bin halt nur Hobby-Programmer ). Aber ich interpretiere das so: - mit "CreateObject" generierst Du offenbar in Windows einen neuen Task. Diesen sollte man, wie bei einem normalen Programmaufruf, auf wieder beenden. Ansonsten bleibt er stehen. In Windows kann man bekanntlich 2 SWX-Session's laufen lassen. Diese werden vermutlich nummeriert. Wenn Du nun mit Create eine Session aufmachst, kriegt die die Nummer 0. Wenn du eine 2. aufmachst kriegt sie die Nr. 1. Das Macro holt sich vermutlich die nächstbeste Session = Nr. "0") und die, da sie unbemerkt läuft, hat kein Modell offen und das Proggi schmiert mit der Meldung "keine Zeichnung offen" ab. Die Nr.1, in der Du ein Modell offen hast, wird gar nicht bemerkt. - mit "GetObject" ist das natürlich anders. Hier sollte das Progamm einen Fehler geben, wenn keine SWX-Session offen ist. Mit einem SWX-Macro ist das noProb, da es ja aus SWX gestartet wird. Ist es aber ein SWX-externes Programm, könnte das schon mal zu "Missverständnissen" führen. Aber, wie gesagt. Ganz sicher bin ich da auch nicht. Wegen "Set X = nothing" kann schon sein, dass beim beenden eines Programmes alle Object's zurückgesetzt werden. Bin auch nicht ganz sicher. Ich habe es mir aber angewöhnt, dies selbst zu machen. Dann ist es ein kontrollierter "Kill" .
------------------ Gruss Andreas A+E Müller AG Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Projektingenieur (m/w/d) Maschinenbau | Menschen und Technologien zu verbinden, den Perfect Match für unsere Kunden zu gestalten, immer die richtigen Expert:innen für die jeweilige Herausforderung zu finden - das ist unser Anspruch bei FERCHAU und dafür suchen wir dich: als ambitionierte:n Kolleg:in, der:die wie wir Technologien auf die nächste Stufe bringen möchte. Wir realisieren spannende Projekte für namhafte Kunden in allen Technologiebereichen und für alle Branchen und übernehmen Verantwortung für komplexe Entwicklungsprojekte.... | Anzeige ansehen | Projektmanagement |
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Sep. 2004 14:51 <-- editieren / zitieren --> Unities abgeben:
also soweit ich das bisher übersehe Zitat: Original erstellt von Andreas Müller: ...- mit "CreateObject" generierst Du offenbar in Windows einen neuen Task. Diesen sollte man, wie bei einem normalen Programmaufruf, auf wieder beenden. Ansonsten bleibt er stehen. In Windows kann man bekanntlich 2 SWX-Session's laufen lassen. Diese werden vermutlich nummeriert. Wenn Du nun mit Create eine Session aufmachst, kriegt die die Nummer 0. Wenn du eine 2. aufmachst kriegt sie die Nr. 1. Das Macro holt sich vermutlich die nächstbeste Session = Nr. "0") und die, da sie unbemerkt läuft, hat kein Modell offen und das Proggi schmiert mit der Meldung "keine Zeichnung offen" ab. Die Nr.1, in der Du ein Modell offen hast, wird gar nicht bemerkt.
Stimmt fast. Wenn SWX normal läuft, dann wird es mit CreateObject auch gefunden und alles ist paletti. Es wird dann auch kein zusätzlicher Prozess gestartet. Nur wenn es vorher noch nicht läuft, dann wird ein Prozess gestartet, ohne aber richtig hoch zu kommen. Den könnte man dann evtl. mit sowas wie CloseObject wieder beenden, das habe ich nicht probiert, da ja ... Zitat: Original erstellt von Andreas Müller:- mit "GetObject" ist das natürlich anders. Hier sollte das Progamm einen Fehler geben, wenn keine SWX-Session offen ist. Mit einem SWX-Macro ist das noProb, da es ja aus SWX gestartet wird. Ist es aber ein SWX-externes Programm, könnte das schon mal zu "Missverständnissen" führen.
...mit GetObject alles klappt, Fehler lassen sich mit On Error goto abfangen (s.o.) Zitat:
Wegen "Set X = nothing" kann schon sein, dass beim beenden eines Programmes alle Object's zurückgesetzt werden. Bin auch nicht ganz sicher. Ich habe es mir aber angewöhnt, dies selbst zu machen. Dann ist es ein kontrollierter "Kill"
Also da bin ich mir ziemlich sicher, dass VB alle Objecte etc. wieder richtig schließt bzw. aus dem Speicher haut. Zum Glück. Das habe ich vor vielen Jahren bei meinen Programmierversuchen mit Delphi bzw. damals noch TurboPascal für Windows immer nicht richtig auf die Reihe bekommen- mit dem Erfolg, dass die Ressourcen immer ruckzuck verbraucht waren. Ich gehe im Moment davon aus, dass mit GetObject diese meine Probleme behoben sind. Und hoffe, dass das auch morgen noch stimmt Danke an alle Beteiligten! Ciao
------------------ Klaus Massler www.al-ko.de privat... ForumsChat: Schau doch mal hier rein, wenn ihr Zeit habt... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |