| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
 | SOLIDWORKS Online-Kurse | Jederzeit verfügbar << , ein Kurs
|
Autor
|
Thema: [vb.net] COMExeption Solidworks (4932 mal gelesen)
|
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 26. Jan. 2009 11:18 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, ich habe ein mir unerklärbares Problem. Ich habe in vb.net Code geschrieben, welcher in Solidworks einige Teile einfügt und einige operationen durchführt. Solidworks ist über einen COM verweis an vb.net angebunden und wir mit swapp = CreateObject("sldworks.Application") als object in die variable swapp gespeichert. Nun läuft das Program einigemale ohne Probleme durch. Plötzlich aber bleibt es an einer stelle hängen und bringt den Fehler: System.Runtime.InteropServices.COMException wurde nicht behandelt. ErrorCode=-2147417851 Message="Ausnahmefehler des Servers. (Ausnahme von HRESULT: 0x80010105 (RPC_E_SERVERFAULT))" Irgendetwas scheind mit dem COM Object nicht zu stimmen, aber was? Was genau sagt mir dieser Fehler und wie kann ich ihn vermeiden? Dieser fehler dritt ab und zu auch an anderen stellen meines Programms auf. Was mache ich falsch? Sobald ich dann solidworks neu gestartet habe, geht er ohne probleme wieder eine zeit lang über die Codepasage drüber, bis wieder der fehler auftritt. Hier das gesamte Ausnahmedetail: System.Runtime.InteropServices.COMException wurde nicht behandelt. ErrorCode=-2147417851 Message="Ausnahmefehler des Servers. (Ausnahme von HRESULT: 0x80010105 (RPC_E_SERVERFAULT))" Source="Interop.SldWorks" StackTrace: bei SldWorks.ISelectionMgr.GetSelectedObject6(Int32 Index, Int32 Mark) bei WindowsApplication1.adscrews.mate_screws(SldWorks swApp) in C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2008\Projects\Parabelrechner\Parabelrechner\Programms\adscrews.vb:Zeile 225. bei WindowsApplication1.swAddStandardScrews.Button1_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2008\Projects\Parabelrechner\Parabelrechner\Forms\swAddStandardScrews.vb:Zeile 154. bei System.Windows.Forms.Control.OnClick(EventArgs e) bei System.Windows.Forms.Button.OnClick(EventArgs e) bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) bei System.Windows.Forms.Control.WndProc(Message& m) bei System.Windows.Forms.ButtonBase.WndProc(Message& m) bei System.Windows.Forms.Button.WndProc(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.RunDialog(Form form) bei System.Windows.Forms.Form.ShowDialog(IWin32Window owner) bei System.Windows.Forms.Form.ShowDialog() bei WindowsApplication1.main.Button1_Click_1(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\Administrator\Eigene Dateien\Visual Studio 2008\Projects\Parabelrechner\Parabelrechner\Forms\main.vb:Zeile 265. bei System.Windows.Forms.Control.OnClick(EventArgs e) bei System.Windows.Forms.Button.OnClick(EventArgs e) bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) bei System.Windows.Forms.Control.WndProc(Message& m) bei System.Windows.Forms.ButtonBase.WndProc(Message& m) bei System.Windows.Forms.Button.WndProc(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) bei System.Windows.Forms.Application.Run(ApplicationContext context) bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) bei WindowsApplication1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81. bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() bei System.Threading.ThreadHelper.ThreadStart_Context(Object state) bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) bei System.Threading.ThreadHelper.ThreadStart() InnerException:
Anbei noch ein Screenshot den ich im Kompiler erstellt habe. Ich hoffe Ihr könnt mir helfen.
[Diese Nachricht wurde von gegy3 am 26. Jan. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 26. Jan. 2009 12:16 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Hi, ich würde generell Try und Catch Blöcke verwenden um die Fehler abzufangen. Am besten um die Fehlerstelle um dann auch mal mit dem Debugger arbeiten zu können. Bei deinem Problem würde ich an der Stelle mal einen Haltepunkt setzen und schauen ob du nicht evtl. in dem Selectionmanager nicht versucht ein nicht vorhandenes Element zu selektieren da du hier ja noch ein i+1 verwendest, aber auch gleichzeitig in einer For-Schleife bist, die sowieso das i hochzählt und das bis zur angegebenen Grenze. Irgendwann bist du dann bei Grenze + 1. Das könnte evtl. der Fehler sein. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 26. Jan. 2009 12:44 <-- editieren / zitieren --> Unities abgeben:         
Hallo...danke für Deine Antwort: Mit try und catch habe ich es schon mal versucht. Ich habe hier mal einen isolierten Code, der den Fehler verursacht: Code: Dim swapp As SldWorks.SldWorks swapp = CreateObject("Sldworks.Application") Dim selMngr As SldWorks.SelectionMgr Dim Doc As SldWorks.ModelDoc2 Doc = swapp.ActiveDoc selMngr = Doc.SelectionManager Dim selObjectsCoun As Integer selObjectsCoun = selMngr.GetSelectedObjectCount() Dim i As Integer Dim selArray(2) For i = 0 To selObjectsCoun - 1 selArray(i) = selMngr.GetSelectedObject5(i + 1) Next
Man nehme an vor dem Ausführen ist eine Zylindefläche und eine normale Fläche selektiert. Der Code funktioniert auch ohne Probleme, nur nach einiger Zeit bekomme ich dann den Fehler beim befüllen des Arrays. Der erste Index des Arrays lässt sich noch befüllen, der zweite aber nicht mehr. Ich habe nun versuch mal zwei andere Fläche zu selektieren im selben Bauteil. KEIN PROBLEM!!! Wenn ich aber wieder die anderen beiden Flächen nehme, bekomme ich wieder das Problem. Erst nach einem Neustart von Solidworks ist das Problem für einige zeit verschwunden. Kann ich solidworks auch anders als über ein COM Object an vb.net anbinden?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matthias Mitglied Programmierer

 Beiträge: 43 Registriert: 06.07.2000
|
erstellt am: 26. Jan. 2009 12:56 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Hallo, Zitat: Kann ich solidworks auch anders als über ein COM Object an vb.net anbinden?
Probiers mal mit
Code: swApp = (SldWorks.SldWorks) Marshal.GetActiveObject("SldWorks.Application")
Gruß ------------------ Matthias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 26. Jan. 2009 12:57 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Hallo, nimm doch mal das i+1 aus dem Code: selArray(i) = selMngr.GetSelectedObject5(i + 1)
raus und schreibe da nur "i" rein.Man kann SWX auch so einbinden: Code: swApp = CType(GetObject(Class:="Sldworks.Application.16"), SldWorks.SldWorks)
Die 16 steht für SWX 2008, 17 für 2009 usw. [Diese Nachricht wurde von monti0505 am 26. Jan. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 26. Jan. 2009 13:04 <-- editieren / zitieren --> Unities abgeben:         
Zitat: swApp = (SldWorks.SldWorks) Marshal.GetActiveObject("SldWorks.Application")
Zitat: swApp = CType(GetObject(Class:="Sldworks.Application.16"), SldWorks.SldWorks)
Bei beiden Varianten muss ich aber einen Verweis auf das COM Object Solidworks machen, oder? Zitat: nimm doch mal das i+1 aus dem Code: selArray(i) = selMngr.GetSelectedObject5(i + 1) raus.
Wenn ich aus i+1 ein i mache, will er jauch das selektierte Object 0 (wenn i = 0) holen, wie man aber in der API Hilfe von solidworks nachlesen kann, beginnt er hier bei 1 zu zählen: Zitat: retval = SelectionMgr.GetSelectedObject5 ( AtIndex )Input: (long) AtIndex Index position within the current list of selected items, where AtIndex ranges from 1 to SelectionMgr::GetSelectedObjectCount
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 26. Jan. 2009 13:08 <-- editieren / zitieren --> Unities abgeben:         
|
monti0505 Mitglied Ingenieur

 Beiträge: 33 Registriert: 16.07.2008
|
erstellt am: 26. Jan. 2009 13:27 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Zitat: Original erstellt von gegy3: Wenn ich aus i+1 ein i mache, will er jauch das selektierte Object 0 (wenn i = 0) holen, wie man aber in der API Hilfe von solidworks nachlesen kann, beginnt er hier bei 1 zu zählen: [QUOTE]retval = SelectionMgr.GetSelectedObject5 ( AtIndex ) Input: (long) AtIndex Index position within the current list of selected items, where AtIndex ranges from 1 to SelectionMgr::GetSelectedObjectCount
[/QUOTE] Hi,
starte die For-Schleife bei 1 und mache bei der Grenzangabe das "-1" weg. Ein Problem ist, denke ich, dass du durch das "+1" über die Grenze hinweg kommst. Soweit ich weiss kann man auf die SWX -API nur per COM zugreifen. Das ändert sich auch nicht, wenn du VB.net verwendest.
[Diese Nachricht wurde von monti0505 am 26. Jan. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 26. Jan. 2009 13:41 <-- editieren / zitieren --> Unities abgeben:         
Ich muss jetzt leider warten bis der fehler wieder auftritt, weil ich solidworks neu gestartet habe und nun der fehler wieder weg ist. Ich kann nun genau die selben Objekte wieder selektieren und der Fehler kommt nicht. Ich denke nicht, dass ich da nen Programmierfehler hab...naja sobald ich den Fehler wieder habe, kann ich dir sagen ob deine Änderung etwas geholfen hat. *Edit* Ich kann den Fehler ja nicht mal reproduzieren. 
[Diese Nachricht wurde von gegy3 am 26. Jan. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 02. Dez. 2009 17:05 <-- editieren / zitieren --> Unities abgeben:         
Ich muss meinen Beitrag nochmal Pushen. Hab noch immer keine Lösung für mein Problem. Noch immer bekomme ich ab und zu den Fehler: HRESULT: 0x80010105 (RPC_E_SERVERFAULT) Ich bekomme jetzt in folgender Codezeile den Fehler: swAddedCompFace = swAddedCompBody.GetFirstFace Solange ich solidworks nicht neu starte spuckt mein Programm immer den selben Fehler an der gleichen Stelle aus. Ich habe schon versucht den Garbage Collector vorher manuel zu starten, hilf aber auch nichts. Ich bin am verzweifeln! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 01. Apr. 2010 10:13 <-- editieren / zitieren --> Unities abgeben:         
|
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: 01. Apr. 2010 10:20 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Hast Du mal probiert, eine Fehlerbehandlung einzuschalten und bei Fehler es nochmal versuchen zu lassen? Vielleicht antwortet nur irgendwas nicht rechtzeitig. ------------------ Lutz Federbusch Mein Gästebuch Der Mensch, Herr oder Sklave der Technik? [Diese Nachricht wurde von Lutz Federbusch am 01. Apr. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 01. Apr. 2010 10:25 <-- editieren / zitieren --> Unities abgeben:         
Meinst du mit Try ...end Try? ich bin den code schritt für schritt durchgegangen. Einige male läuft das Programm sauber durch, irgendwann dann tritt der Fehler dann plötzlich auf. Der Fehler tritt dann so lange auf, bis ich solidworks neu starte. Auch mein Programm neu zu starten (also alle variablen und objekte löschen) bringt da nichts. Irgendwo im Speicher liegt noch was rum, was den Fehler auslöst. Es ist zum verzweifeln.  Die Leute die das Programm nutzen sind bereits verärgert, da sie immer solidworks neu starten müssen, damit es wieder funktioniert. Ich wäre ja schon etwas froher, wenn man nur mein Programm neu starten müsste und nicht gleich solidworks. Zitat: Vielleicht antwortet nur irgendwas nicht rechtzeitig.
Naja, wenn was nicht rechtzeitig antwortet, warum läuft der code dann einige male ohne probleme durch? Ich mach wirklich immer das gleiche. Wenn ich dann solidworks beende und neu starte, kann ich das Programm an der selben stelle wieder seine Tätigkeit ausführen lassen...alles geht, bis irgendwann wieder der Fehler auftritt. [Diese Nachricht wurde von gegy3 am 01. Apr. 2010 editiert.] [Diese Nachricht wurde von gegy3 am 01. Apr. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mkkk Mitglied
 
 Beiträge: 105 Registriert: 04.03.2005
|
erstellt am: 01. Apr. 2010 10:59 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
|
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 01. Apr. 2010 11:06 <-- editieren / zitieren --> Unities abgeben:         
Zitat: ersetz doch mal Dim selArray(2)durch Dim selArray() ReDim selArray(selObjectsCount-1)
Ich glaub das hatte ich schon mal versucht. hat das Problem nicht gelöst. Hier im Code tritt der Fehler auch ab und zu auf: Code: i = 0 Do Until swAddedCompFace Is Nothing swFaceSurface = swAddedCompFace.GetSurface If Not swFaceSurface.IsCylinder Then swSafeFacesTemp = swAddedCompFace ReDim Preserve swSafeFaces(i) swSafeFaces(i) = swSafeFacesTemp.GetSafeEntity i += 1 End If 'GC.Collect() swAddedCompFace = swAddedCompFace.GetNextFace Loop
Da dimensioniere ich das Array erst später im code. Der Fehler tritt auf, wenn er die Zeile swFaceSurface = swAddedCompFace.GetSurface ausführt, obwohl swAddedCompFace NICHT nothing ist.
[Diese Nachricht wurde von gegy3 am 01. Apr. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MWN Mitglied Dipl.-Ing.
 
 Beiträge: 492 Registriert: 14.02.2007
|
erstellt am: 01. Apr. 2010 11:34 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Hast du denn schon mal den Garbage - Collector per Hand angeschmissen, oder es zumindest probiert? Wenn du alle nicht mehr benötigten Variablen ordnungsgemäß mit "nothing" belegst und dann den Garbage - Collector am Ende deines Programms anschmeißt, liegt doch die Wahrscheinlichkeit sehr hoch, dass er dir allen Müll ordnungsgemäß entsorgt und es bei einem erneuten Durchlauf nicht mehr zu Problemen kommt! Grüße Tobias ------------------ Besucht mich doch mal in meiner Tischlerei "...Kommunikation ist nur so gut wie ihr Ergebnis..." - frei nach Richard Bandler / John Grinder Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 01. Apr. 2010 11:40 <-- editieren / zitieren --> Unities abgeben:         
Alle Variablen am Schluss mit nothing belegen hab ich schon gemacht. Den GC hab ich aber nach der Zeile gestartet an der der Fehler auftritt. (GC.Collect()) Ich versuch ihn mal am ende nach der "Variablenleerung" auf zu rufen. Bin auch gerade dabei das ganze von nem Modul in ne Klasse mit Eigenschaften und Methoden um zubauen. vielleicht werden Klassenopjekte sauerberer gekillt am ende? Ein Problem ist es ja noch dazu, dass ich nicht weiß wann der Fehler auftritt....somit kann ich ihn nicht vernüftig Debuggen.  [Diese Nachricht wurde von gegy3 am 01. Apr. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MWN Mitglied Dipl.-Ing.
 
 Beiträge: 492 Registriert: 14.02.2007
|
erstellt am: 01. Apr. 2010 12:53 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Trotz alledem gehört eine ordentliche Fehlerroutine zu einem vernünftigen Programm dazu. Du solltest wirklich mal überlegen, ob du nicht mit Code: Try . . . Catch . . . Finally
arbeitest. Das bietet dir unter anderem auch die Möglichkeit, bei einem eventuellen Fehler, etwas anderes ausführen zu lassen, bzw. ihm noch finale Anweisungen mitzugeben. GrüßeTobias ------------------ Besucht mich doch mal in meiner Tischlerei "...Kommunikation ist nur so gut wie ihr Ergebnis..." - frei nach Richard Bandler / John Grinder Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gegy3 Mitglied
 
 Beiträge: 300 Registriert: 26.04.2006 SolidWorks 2012 SP 5.0
|
erstellt am: 01. Apr. 2010 12:55 <-- editieren / zitieren --> Unities abgeben:         
|
mkkk Mitglied
 
 Beiträge: 105 Registriert: 04.03.2005
|
erstellt am: 01. Apr. 2010 13:44 <-- editieren / zitieren --> Unities abgeben:          Nur für gegy3
Ich habe mir gerade mal das Bild in Deinem ersten Beitrag angeschaut. Ich würde das GetSelectedObject6 mit -1 als Mark-Parameter verwenden, also: swSelMgr.GetSelectedObject6(i+1,-1) Dann bekommst Du auch alle ausgewählten Objekte und nicht nur die mit Markierung 0, wenn es die überhaupt gibt ;-)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |