Autor
|
Thema: COMExeption wurde nicht behandelt (3215 mal gelesen)
|
leon0109 Mitglied
Beiträge: 21 Registriert: 20.08.2011 CATIA V5 R19 SP3 Win 7 Pro 64
|
erstellt am: 04. Dez. 2011 15:02 <-- editieren / zitieren --> Unities abgeben:
Hallo! Grüß an alle! Ich programmiere eine Schnittstelle zu CATIA mit C#. Über Buttons will mansche Funktionen von CATIA extern steuern. Habe folgender Code erstellt private void ProduktOeffnen_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open"; dlg.Filter = "Projekt(*.CATpart)|*.CATpart|All Files(*.*)|*.*"; dlg.ShowDialog(); INFITF.Application catiaApplication = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); INFITF.Document catiaDocument; string input = ""; catiaDocument = catiaApplication.Documents.Open(ref input); catiaDocument = catiaApplication.ActiveDocument;
Dialog wurde geöffnet aber wenn ich Projekt öffnen will bringt mir folgende Fehler System.Runtime.Interopservice.COMException{"Beim Aufruf einer COM-Komponente wurde ein HRESULT E_FAIL Fehler zurückgegeben"} COMExeption wurde nicht behandelt! Der Fehler ist wahrscheinlich Trivial aber ich komme nicht weiter. Bitte um Hilfe
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 05. Dez. 2011 13:11 <-- editieren / zitieren --> Unities abgeben: Nur für leon0109
Guten Tag, also wenn ich Ihren Code so recht verstehe haben Sie einen groben Fehler... Sie übergeben Schlichtweg keinen Pfad zum Öffnen. Zitat:
Code: string input = ""; catiaDocument = catiaApplication.Documents.Open(ref input);
Ein leerer String wird erzeugt und anschließend übergeben! Muss heißen (wenn man davon ausgeht, das der Ausgewählte Pfad zuvor genutzt werden soll!): Code:
catiaDocument = catiaApplication.Documents.Open(dlg.FileName);
Nochmal komplett von meinem Test (sorry - ist in VB, aber ist ja klar)
Code:
dim oCatia as INFITF.Application = System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application") dim dlg as New Windows.Forms.OpenFileDialog dlg.Title = "Open" dlg.Filter = "Projekt(*.CATpart)|*.CATpart|All Files(*.*)|*.*" dlg.ShowDialog() Dim oDoc as INFITF.Document = oCatia.Documents.Open(dlg.FileName)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
leon0109 Mitglied
Beiträge: 21 Registriert: 20.08.2011 CATIA V5 R19 SP3 Win 7 Pro 64
|
erstellt am: 05. Dez. 2011 16:10 <-- editieren / zitieren --> Unities abgeben:
|
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 05. Dez. 2011 17:18 <-- editieren / zitieren --> Unities abgeben: Nur für leon0109
Nur so ne Idee: CATIA hat auch einen FileDialog, den kann man auch verwenden. Erleichtert vielleicht den Umgang und der kann auch mit DLNames. :-) Edit: Übrigens würde ich nach der Auswahl des Files, den String auch prüfen ob er nicht zufällig leer ist (User hat auf Abbrechen gedrückt). Die schnellste VB Methode dafür wäre: if(sReturnString = vbNULLString) then exit sub end if ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Stammtisch in Wolfsburg http://ww3.cad.de/foren/ubb/Forum491/HTML/000179.shtml [Diese Nachricht wurde von HoBLila am 05. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 05. Dez. 2011 19:00 <-- editieren / zitieren --> Unities abgeben: Nur für leon0109
Bezüglich des Abbrechens des OpenFileDialog ist dies in C# wie folgt zu prüfen: Code:
INFITF.Document oDoc; if (dlg.ShowDialog() == DialogResult.OK){ oDoc = oCatia.Documents.Open(dlg.FileName); }
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
leon0109 Mitglied
Beiträge: 21 Registriert: 20.08.2011 CATIA V5 R19 SP3 Win 7 Pro 64
|
erstellt am: 06. Dez. 2011 00:20 <-- editieren / zitieren --> Unities abgeben:
Hallo! Habe jetzt ausprobiert und Code sieht so aus: private void ProduktOeffnen_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open"; dlg.Filter = "Projekt(*.CATproduct)|*.CATproduct|Projekt(*.CATpart)|*.CATpart|All Files(*.*)|*.*"; dlg.ShowDialog(); INFITF.Application catiaApplication = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); INFITF.Document catiaDocument; if (dlg.ShowDialog() == DialogResult.OK) { catiaDocument = catiaApplication.Documents.Open(dlg.FileName); } catiaDocument = catiaApplication.ActiveDocument; } aber jetzt wenn ich ein Part oder Produkt wähle und mit "öffnen" bestätige, macht mir Dialogfenster noch mal auf und muss noch mal bestätigen. Habe ich da was falsch verstanden. Grüß Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 06. Dez. 2011 09:27 <-- editieren / zitieren --> Unities abgeben: Nur für leon0109
Du hast 2x dlg.ShowDialog() drin. nimm das erste raus. :-) Code:
private void ProduktOeffnen_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open"; dlg.Filter = "Projekt(*.CATproduct)|*.CATproduct|Projekt(*.CATpart)|*.CATpart|All Files(*.*)|*.*"; INFITF.Application catiaApplication = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); INFITF.Document catiaDocument; if (dlg.ShowDialog() == DialogResult.OK) { catiaDocument = catiaApplication.Documents.Open(dlg.FileName); } catiaDocument = catiaApplication.ActiveDocument; }
------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Stammtisch in Wolfsburg http://ww3.cad.de/foren/ubb/Forum491/HTML/000179.shtml Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gladly Mitglied
Beiträge: 56 Registriert: 02.11.2007 Catia V5R19SP9HF40 64Bit Windows XP Pro x64
|
erstellt am: 06. Dez. 2011 09:43 <-- editieren / zitieren --> Unities abgeben: Nur für leon0109
Guten Tag, du hast schlicht zwei Mal das Öffnen des Dialog in deinem Code! dlg.ShowDialog() ist eine Funktion mit dem Rückgabewert eines Enums DialogResult. Beim ersten rufst du einfach auf. Beim zweiten rufst du auf und prüft gleichzeitig auf den Rückgabewert (was ja gewollt ist). Ersten entfernen und fertig. Desweiteren denke ich ist die Doppelte zuweisung des catiaDocument unnötig. Der Rückgabewert des Open-Befehl ist ja das geöffnete Dokument, welches auch Active geschaltet wird. Somit weist du in der nächsten Zeile nochmal das SELBE Dokument zu. Nächste Sache ist, wenn jemand auf Abbrechen bei der Dateiauswahl drückt wird kein Dokument geöffnet. Hast du kein anderes im Catia offen wird dein Code bei der Zuweisung des ActiveDocument auf Fehler laufen! Code:
private void ProduktOeffnen_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open"; dlg.Filter = "Projekt(*.CATproduct)|*.CATproduct|Projekt(*.CATpart)|*.CATpart|All Files(*.*)|*.*"; // dlg.ShowDialog(); //Weg da ja unten genutzt wird! INFITF.Application catiaApplication = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); INFITF.Document catiaDocument; if (dlg.ShowDialog() == DialogResult.OK) { catiaDocument = catiaApplication.Documents.Open(dlg.FileName); } //catiaDocument = catiaApplication.ActiveDocument; //Doppelt gemoppelt?! }
Edit: Und schon wieder zu langsam... Ich muss das 10 Finger-System lernen um diese unnötigen Doppelpostings vermeiden zu können [Diese Nachricht wurde von gladly am 06. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HoBLila Mitglied Dipl.-Ing. (BA) praktische Informatik - Senior Entwickler CAx
Beiträge: 1118 Registriert: 29.05.2008 DELL PRECISION T3500 Intel(R) Xeon(R) CPU W3540 @ 2.93GHz 12285 MB RAM NVIDIA Quadro FX 1800 Microsoft Windows 7 Enterprise Service Pack 1 CATIA V5 R19 SP09 HF69 VB6.5 CAA RADE CDC
|
erstellt am: 06. Dez. 2011 10:51 <-- editieren / zitieren --> Unities abgeben: Nur für leon0109
Ich schreib auch nur mit meinem eigenen 3,5 Finger Adler-Suchsystem :-) Wir Entwickler lernen das ja nie richtig und wenn sich das einmal falsch festgesetzt hat... :-) Dein Post ist aber dennoch der bessere, da Du nicht nur das eine Problem gelöst, sondern den kompletten Code, mit Erklärungen verbessert hast. ------------------ Mit freundlichen Grüßen, Henry Schneider alias Lila Es gibt einen ewigen Wettkampf zwischen der Natur und den Ingenieuren: Die Ingenieure versuchen, immer idioten-sicherere Systeme zu bauen, die Natur versucht, immer bessere Idioten zu bauen Xing Stammtisch in Wolfsburg http://ww3.cad.de/foren/ubb/Forum491/HTML/000179.shtml Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
leon0109 Mitglied
Beiträge: 21 Registriert: 20.08.2011 CATIA V5 R19 SP3 Win 7 Pro 64
|
erstellt am: 06. Dez. 2011 12:41 <-- editieren / zitieren --> Unities abgeben:
|