Autor
|
Thema: SmSession aus CATIA sauber beenden (3023 mal gelesen)
|
phimUoB Mitglied Ingenieur
Beiträge: 107 Registriert: 08.08.2003 CATIA/Smarteam V5R16 Linux, Oracle, VMWare
|
erstellt am: 21. Feb. 2006 14:45 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich habe mal wieder ein API Problem. Nach der Umstellung auf R16 funktioniert unser als DLL realisiertes Stücklisten-Tool nicht mehr sauber. Das Tool wird aus CATIA gestartet, erzeugt eine SmGUISrv.SmCommonGUI Session, holt sich Daten aus der Smarteam Datenbank, macht die Session wieder zu und erzeugt Texte in einer CATIA Drawing. Der Smarteam Sessseion Teil sieht so aus: Code:
Option ExplicitPrivate Engine As SmApplic.SmFreeThreadedEngine Private Session As SmApplic.SmSession 'Startet SmarTEAM Session Public Function StartSmarTeam() As SmApplic.SmSession On Error GoTo ErrorStartSmarTeam Dim Database As SmApplic.SmDatabase Set Engine = CreateObject("SmApplic.SmFreeThreadedEngine") Engine.Init "SmTeam32" Set Session = CreateObject("SmApplic.SmSession") Session.Init Engine, "UniBernBOM", "Smteam32" Set Database = Engine.Databases(0) Session.OpenDatabaseConnection Database.Alias, Database.Password, True ' Dim GuiService As SmGUISrv.SmGUIServices ' Set GuiService = Session.GetService("SmGUISrv.SmGUIServices") ' GuiService.GUIStore.LogIn Dim GuiService As SmGUISrv.SmCommonGUI Set GuiService = Session.GetService("SmGUISrv.SmCommonGUI") GuiService.Dialogs.ExecuteLogin On Error GoTo 0 GoTo EndStartSmarTeam ErrorStartSmarTeam: MsgBox "StartSmartTeam: " & Err.Description & " (" & Err.Number & ")", vbCritical EndStartSmarTeam: If Session.UserLoggedOn Then Set StartSmarTeam = Session Else Set StartSmarTeam = Nothing End If End Function 'Beendet SmarTEAM Session
Public Function StopSmartTeam() On Error GoTo ErrorStopSmartTeam Session.Close Set Session = Nothing ' Engine.Terminate 'funktioniert ab R16 nicht mehr gut Set Engine = Nothing On Error GoTo 0 GoTo EndStopSmarTeam ErrorStopSmartTeam: MsgBox "StopSmartTeam: " & Err.Description & " (" & Err.Number & ")", vbCritical EndStopSmarTeam: End Function
Es gibt noch eine 'Hauptfunktion' die zuerst StartSmarTeam() und dann StopSmartTeam() aufruft. Mit R14 lief alles sehr gut. Seit R16 darf ich aber kein Engine.Terminate mehr machen da sonst beim zweiten Mal, also wenn die Funktion StartSmarTeam() nach StopSmartTeam() nochmals aufgerufen wird, folgender Fehler kommt: Zitat: Error No: 00621 The security device option ('') does not match the database. You might be exceeding the number of licenses. Consult with your System Administrator.
Mache ich aber kein Engine.Terminate kann ich aus CATIA nicht mehr den Smarteam-User wechseln. SmarTeam -> Disconnect gefolgt von SmarTeam -> Connect fragt dann nicht mehr nach User/Passwort, sondern logt einfach wider mit dem selben User wie vorher ein. Erst nach einem CATIA Neustart kann wieder der SmarTeam User gewählt werden. Wie mache ich also meine Session richtig tot? Gruss, Beat
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
urxter Mitglied
Beiträge: 3 Registriert: 17.06.2008
|
erstellt am: 10. Jun. 2010 17:11 <-- editieren / zitieren --> Unities abgeben: Nur für phimUoB
Hallo Beat Es sieht so aus, dass ich hier an der Universität den Code von dir weiterpflegen darf Ich denke ich habe dein Problem (das ja jetzt zu meinem wurde) gelöst. In R18 funktioniert Engine.Teminate() wieder und durch Probieren ist mir aufgefallen, das Session.UserLogoff() hier zusätzliche Abhile liefert. Die beiden Zuweisungen von Nothing sind ebenfalls nötig, wenn die (Test-)Applikation nach StopSmartTeam() noch weiterläuft und vielleicht nochmals StartSmarTeam() aufruf. Das ganze läuft jedoch mittlerweile unter VB 9, also als .NET-Applikation: Code:
'Beendet SmarTEAM Session Public Function StopSmartTeam() As Object On Error Resume Next Session.UserLogoff() Session.Close() Engine.Terminate() Session = Nothing Engine = Nothing End Function
Leider kann ich mit CATIA V5R18 x64 den Code nicht direkt von VBscript aus der DLL aufrufen, einige Funktionen der SmarTeam Libraries erzeugen Exceptins, wenn sie von einer 64-Bit-Applikation aufgerufen werden. Als einfachsten Workaround starten wir nun aus VBscript ein 32-Bit-Exe, das dann die SmarTeam-Funktionen aufruft. Hat im Zusammenhang mit CATIA x64 schon jemand Erfahrungen mit SmarTeam V5 R20 gemacht? Grüsse Urs Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
phimUoB Mitglied Ingenieur
Beiträge: 107 Registriert: 08.08.2003 CATIA/Smarteam V5R16 Linux, Oracle, VMWare
|
erstellt am: 15. Jun. 2010 08:41 <-- editieren / zitieren --> Unities abgeben:
Hoi Urs, Ich weis nicht ob es bei SmarTeam helfen würde aber wir laden uns in UG NX7 die DLLs mit Reflection aus einem vb Skript: Code:
Option Strict offImports System Imports System.Reflection Imports NXOpen Imports NXOpen.UF Module NXEXample Public Class DLLLauncher Shared Sub Launcher(session As Session, ufsession As UFSession) Dim a As [Assembly] = [Assembly].LoadFrom("D:\NXbin\RUAG NX Tools.dll") Dim t As Type = a.GetType("RUAGNXToolsDLL.RUAGNXTools") Dim p() As Object = {session, ufsession} t.GetMethod("fix").Invoke(Nothing, p) End Sub End Class
Sub Main Dim theSession As Session = Session.GetSession() Dim theUFSession As UFSession = UFSession.GetUFSession() DLLLauncher.Launcher(theSession, theUFSession) End Sub
Public Function GetUnloadOption(ByVal dummy As String) As Integer GetUnloadOption = UFConstants.UF_UNLOAD_IMMEDIATELY End Function End Module
Das Objekt DLLLauncher holt sich die DLL als Assembly und führt eine bestimmte Funktion (hier heisst sie "fix") in der DLL aus. RUAGNXToolsDLL ist der Namespace und RUAGNXTools das Objekt in der DLL. Mit dem Objekt p können auch noch Argumente an die Funktion übergeben werden. Eventuell funktioniert das auch mit SmarTeam und 64bit besser. ------------------ Beitrag im Dassault Contact mag: Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|