| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| SPS |
Autor
|
Thema: Aktive SolidWorksversion mit Vb ermitteln (4413 mal gelesen)
|
Carsten Hess Mitglied Konstrukteur
Beiträge: 7 Registriert: 23.07.2004
|
erstellt am: 25. Apr. 2012 10:08 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, Ich habe ein kleines Problem mit den ermitteln der SolidWorks Instance. Ich versuche über getobject(,"SldWorks.Application") die zuletzt gestartete SolidWorks Version zu ermittelt. Auf dem Rechner ist SW2010 und sw2011 installiert. Wenn sw2010 geöffnet ist, will die getobject methode sw2011 ermitteln. Dies zeigt sich dadurch, dass wenn ich anstatt getobject createobject aufrufe sw2011 geöffnet wird. Die versionen sind 64bit Anwendungen. Kann es sein, dass die 64bit Versionen nicht mehr die zuletzt geöffnete SW-Version in der Registry speichert? Mfg Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lutz Federbusch Ehrenmitglied V.I.P. h.c. Dipl.-Ing. Maschinenbau
Beiträge: 3094 Registriert: 03.12.2001 alle SW seit 97+ AutoCAD2016-2022 ERP ProAlpha + CA-Link Intel Core i7-7820K 32GB Win10x64 Quadro K5000 SpacePilot
|
erstellt am: 25. Apr. 2012 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
Mache es doch andersherum: Versuche eine Instanz einer genau bezeichneten Version zu bekommen. Ist das Objekt dann leer, so hast Du diese nicht... 'Set SwApp = CreateObject("SldWorks.Application.10") 'SW2001+ 'Set SwApp = CreateObject("SldWorks.Application.13")'SW2005 'Set SwApp = CreateObject("SldWorks.Application.14") 'SW2006 Set SwApp = CreateObject("SldWorks.Application.17") 'SW2009 ------------------ Lutz Federbusch Mein Gästebuch Der Mensch, Herr oder Sklave der Technik? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten Hess Mitglied Konstrukteur
Beiträge: 7 Registriert: 23.07.2004
|
erstellt am: 25. Apr. 2012 10:38 <-- editieren / zitieren --> Unities abgeben:
Hi Lutz, das hatte ich mir auch schon gedacht. Allerdings würde ich damit das Problem nur umgehen. Ich frage mich ob SolidWorks die aktuelle Version nicht mehr speichert oder ob in meinem Betriebssystem bzw. Programm irgendetwas nicht stimmt. Gruß Carsten 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: 26. Apr. 2012 09:00 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
Hallo Carsten, Zitat: Original erstellt von Carsten Hess: Ich frage mich ob SolidWorks die aktuelle Version nicht mehr speichert oder ob in meinem Betriebssystem bzw. Programm irgendetwas nicht stimmt.
Doch, SolidWorks schreibt das zurück in die Registry, genauer gesagt in den Schlüssel HKEY_CLASSES_ROOT\SldWorks.Application\CLSID . Dort wird als Standardwert die CLSID eingesetzt, die dann zur passenden SolidWorks Verison in der Registry führt. Unter Windows 7 ist dieser Schlüssel allerdings im Gegensatz zu früher nur für Administratoren schreibberechtigt (weil unter HKLM und nicht HKCU), deswegen musst du wahlweise SolidWorks als Admin starten bzw. bekommst über CreateObject immer die Verion, die zuletzt als Admin gestartet wurde, oder, wenn das öfter gebraucht wird, stellst du die Berechtigung gezielt für diesen einen Schlüssel auch mit Schreibberechtigung für normale Benutzer ein. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten Hess Mitglied Konstrukteur
Beiträge: 7 Registriert: 23.07.2004
|
erstellt am: 26. Apr. 2012 09:15 <-- editieren / zitieren --> Unities abgeben:
Hi Stefan, vielen Dank für deine Aufklärung. Dies würde ja dann bedeuten, dass unter Win 7 bei einem User mit Hauptbenutzerrechten im regelfall nicht mehr die zuletzt gespeicherte Version mit der API zu holen ist. Es sei denn man geht den Weg den Lutz beschrieben hat. Schade. Vielen Dank für deine Erklärung. Gruß Carsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HartmutT Mitglied Dipl.-Ing (TU) MB
Beiträge: 790 Registriert: 16.06.2006 SWX 2019 SP5.0 MaxxDB 2021.SP0.02 Linked Jan 18 2021 (64bit)
|
erstellt am: 26. Apr. 2012 09:36 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
Hi Gemeinde! Ich möchte auf keinen Fall die Diskussion zum Thema unterbrechen oder ablenken... aber auch folgende Frage/Sache mit in den Raum stellen. Ich denke, eng mit diesem Thema zu verbinden ist folgende unschöne Sache, die wir ab WIN7 spüren: Für eine spätere Besprechung einer Konstruktionslösung starte ich ein SWX und lade ne große BG. Gehe dann zum normalen Geschäft über, starte ein 2. SWX (ja, warum macht er das, fragen jetzt verschiedene Leute, aber das darf man ja machen, also machen es hier einige Personen) Nun im 2. SWX nutze ich meine Helferlein-Makros. Hier sagt mein Makro "Nein, Du kannst mich nicht benutzen, Du hast keine Zeichnung vor Dir!" Warum, ich sitze doch vor ner Zeichnung!!! Nein, sagt das Makro, Du hast in der ersten gestarteten SWX -Anwendung eine BG Also funze ich hier nicht Kann man da Abhilfe schaffen? Wie habt Ihr das gelöst, dieses Problem? Freu mich auf die Lösungsvorschläge, Grüßle H. ------------------ Hartmut 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: 26. Apr. 2012 09:46 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
|
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: 26. Apr. 2012 09:55 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
Hallo Carsten, Zitat: Original erstellt von Carsten Hess: Dies würde ja dann bedeuten, dass unter Win 7 bei einem User mit Hauptbenutzerrechten im regelfall nicht mehr die zuletzt gespeicherte Version mit der API zu holen ist.
Wenn der keine Schreibberechtigung auf dem Schlüssel hat ist das so. Ich weiß zwar nicht so genau, was du mit "gespeicherter Version" meinst, ein erfolgreiches Aufrufen eines SolidWorks versucht diesen Schlüssel zu aktualiseren. Das eine hat eigentlich wenig mit dem anderen zu tun, die Methode von Lutz versucht herauszufinden, welche Versionen installiert sind und dann ggf. gezielt eine bestimmte Version aufzurufen. Wenn also 2010 und 2011 auf dem Rechner installiert ist bekommst du in beiden Fällen ja eine positive Rückmeldung und weißt immer noch nicht, welche Version interaktiv von einem "normalen" User aufgerufen wurde. Also unterm Strich: entweder du entscheidest, welche Version aufgerufen werden soll (dann mit der Versionsnummer) oder du verlässt dich darauf, was dir CreateObejct/GetObject liefert auf die Gefahr hin, dass ein normaler Nutzer eben zuletzt eine andere Version aufgerufen hatte als der Admin eingestellt hatte. Das einfachste ist dann wirklich die Berechtigung zu öffnen. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten Hess Mitglied Konstrukteur
Beiträge: 7 Registriert: 23.07.2004
|
erstellt am: 26. Apr. 2012 10:09 <-- editieren / zitieren --> Unities abgeben:
Hi Stefan, allerdings kann ich mit getobject alle SolidWorksversionen durchgehen bis eine Version erfolgreich gefunden wurde. Diese ist dann geöffnet. Sollte kein Ergebnis erfolgen ist auch keine SolidWorksversion geöffnet. Es erscheint mir ein wenig aufwendig das jeder der das Makro nutzen will erst die berechtigungen der Registry mit einem Adminzugang ändern muss. Gruß Carsten 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: 26. Apr. 2012 10:33 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
Ein anderer Schnack: hast du es denn statt mit GetObject einfach mit Code: Set swApp = Application.SldWorks
probiert? Wenn ich mich nicht irre bekommst du damit immer das aktuelle Application-Objekt, also die Sitzung, aus der du gerade dein Makro heraus aufgerufen hast.Ciao, Stefan
------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HartmutT Mitglied Dipl.-Ing (TU) MB
Beiträge: 790 Registriert: 16.06.2006 SWX 2019 SP5.0 MaxxDB 2021.SP0.02 Linked Jan 18 2021 (64bit)
|
erstellt am: 26. Apr. 2012 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
...genau und so wird auch mein Wunsch erfüllbar! im Makro bei mehreren laufenden SWX -Anwendungen einfach ein Auswahlfenster siehe Bildchen wo anwählbar ist, welches SWX gemeint ist. ------------------ Hartmut Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Carsten Hess Mitglied Konstrukteur
Beiträge: 7 Registriert: 23.07.2004
|
erstellt am: 26. Apr. 2012 10:53 <-- editieren / zitieren --> Unities abgeben:
|
contraengineer Mitglied Maschinenbauer
Beiträge: 6 Registriert: 27.03.2014 HP Z420 Intel Xeon E5-1620 v2 @3,7GHz 32 GB Ram AMD FirePro W7000 (leider) Windows7 SP1 (64bit) ProE WF3 (M250) mit Intralink 3.4 Creo3 (M070) mit Windchill PDM-Link10.2 M030-CPS11 Solidworks 2012 SP5 mit EPDM
|
erstellt am: 22. Jan. 2015 18:41 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
Probieren Sie mal die Methode GetLatestSupportedFileVersion des SldWorks-Objektes: Code:
Dim oswApp As SldWorks.SldWorks Dim lSldversion As LongSet oswApp = Application.SldWorks lSldversion = oswApp.GetLatestSupportedFileVersion MsgBox lSldversion
Zur Interpretation siehe API reference ------------------ Viele Grüße! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thisoft Mitglied Konstrukteur
Beiträge: 178 Registriert: 10.04.2010
|
erstellt am: 23. Jan. 2015 09:46 <-- editieren / zitieren --> Unities abgeben: Nur für Carsten Hess
Hallo zusammen, um unter .NET aus mehreren geöffneten SWX-Instanzen die richtige auszuwählen hätte ich was anzubieten: Code: Private Function ConnectSWX() As SWX.SldWorks Dim sldproclist As Process() = Process.GetProcessesByName("sldworks") Dim rot As System.Runtime.InteropServices.ComTypes.IRunningObjectTable Dim ppmk As System.Runtime.InteropServices.ComTypes.IMoniker Dim Meldung As String = "Es wurden mehrere Solidworks-Prozesse gefunden! Bitte die Kennung des gewünschten Prozesses angeben!" & vbCrLf Dim AktProc As Integer = 0 For i = 0 To UBound(sldproclist) Meldung += CStr(i) & " " & sldproclist(i).MainWindowTitle & vbCrLf Next If UBound(sldproclist) > 0 Then AktProc = InputBox(Meldung, "SWX-Sitzung auswählen!", 0) End If Dim sldproc As Process = Process.GetProcessesByName("sldworks")(AktProc) CreateItemMoniker(Nothing, "SolidWorks_PID_" & sldproc.Id.ToString(), ppmk) GetRunningObjectTable(0, rot) Dim swAppObj As Object = Nothing rot.GetObject(ppmk, swAppObj) If swAppObj IsNot Nothing Then Return DirectCast(swAppObj, SldWorks.SldWorks) Else Return Nothing End If End Sub
Ich mißbrauche hier allerdings quick&dirty nur eine gewöhnliche Messagebox als "Auswahlfenster". Sieht nicht besonders schick aus, erfüllt aber den Zweck. Sollte jemand sich bemüßigt fühlen, da jetzt noch ein cooles Formular drumrumzubauen kann er uns ja gerne daran teilhaben lassen. Gruß Thilo Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |