| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

ich möchte eine COM Applikation (zum Beispiel MS Access) nach dem Erstellen geöffnet halten.

Bsp:
Public Class Form1

Dim oAccess As Microsoft.Office.Interop.Access.Application

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
oAccess = CType(CreateObject("Access.Application"), Microsoft.Office.Interop.Access.Application)
oAccess.Visible = True
End Sub
End Class


Schieße ich jetzt Form1, wird auch Access geschlossen. Das möchte ich gerne unterbinden. Ist das möglich?

Gruß Karl

PS: Mit Google finde ich nur Anwendungsfälle, in denen das anders herum ist :)
08.11.2011
Karl 958 8
2 Antworten
1
Vermutung, ohne es ausprobiert zu haben:

Wenn es Dir reicht, dass Access zwar das Schließen von Form1 "überlebt", aber nicht das Beenden Deiner Anwendung, müßte es reichen, wenn Du die Referenz auf das COM-Objekt (oAccess in Deinem Beispiel) außerhalb von Form1 hältst, z.B. (ganz quick&dirty) in einem statischen Feld Deiner Program-Klasse oder in irgendeinem Objekt, das so lange lebt wie die Anwendung.

Wenn Access auch nach dem Schließen der ganzen Anwendung weiterlaufen soll, würde ich versuchen, es über Process.Start() zu starten und dann die Verbindung über GetObject() herzustellen (statt CreateObject()).
08.11.2011
Matthias Hlawatsch 13,2k 4 9
Hallo Matthias,
leider habe ich kein statisches Objekt was über die ganze Laufzeit erhalten bleibt.
Habe schon vermutet, dass ich schauen muss, ob ein Prozess schon am laufen ist. Dachte nur, das es eventuell eine elegantere Lösung gibt. Unter VB6 hatte ich dieses Problem nicht ;)

Danke dir

Karl
Karl 08.11.2011
Wenn Du kein passendes Objekt hast, kannst Du auf jeden Fall ein statisches Feld benutzen. Das existiert, wenn ich mich nicht irre, vom Laden der Klasse bis zum Entladen der Assembly, also normalerweise bis zum Stop der Anwendung.
Matthias Hlawatsch 08.11.2011
Genau das ist das Problem.
Die (COM-)Applikation wird gestartet, es wird eine Query ausgeführt und dann ist die Arbeite meines Programms schon beendet. Somit wird auch die COM-Applikation beendet. Bleibt also nix anderes übrig, als zu schauen, ob die COM-Applikation schon läuft, und ggf. eine neu zu starten und mich dann dran zu hängen.
Karl 08.11.2011
Ok. Ich hatte Deinen ersten Kommentar so verstanden, dass die erste Variante funktionieren würde, also Access läuft nur bis zum Ende des Programms.
Matthias Hlawatsch 08.11.2011
Sorry, dann habe ich mich falsch Ausgedrückt :)
Karl 10.11.2011
1
So habe ich es jetzt gelößt.

Erst prüfen, ob schon eine Instanz läuft.
Dim oProcesses() As Process
oProcesses = Process.GetProcessesByName("myApplication")
If oProcesses.Length = 0 Then
Process.Start(PathToApplication)
Threading.Thread.Sleep(5000)
End If


anschließend mit
Import myApplication

If oApplication Is Nothing Then
oApplication = CType(CreateObject("myApplication.Application"), Application)
End If

entsprechende Instanz besorgen. GetObject() lief hier nicht. Es kam immer eine Exception mit der Meldung "activex-komponente konnte nicht erstellt werden". Laut Google scheint es ein Security Problem zu sein. CreateObject() startet in meinem Fall keine neue Instanz, sondern verwendet die schon laufende.

Gruß Karl
09.11.2011
Karl 958 8
OK, sehr interessant +1. Nur eine Frage: Wieso das Sleep(5000)? Hat das einen besonderen Grund?
Eiger 10.11.2011
Das Starten einer Applikation kann ein wenig Zeit in Anspruch nehmen. Ich dachte mir, da warte ich lieber ein bisschen. Eventuell baue ich dort noch eine Fortschrittsanzeige ein :)
Karl 10.11.2011
OK. Habs zwar selbst noch nicht ausprobiert, aber wäre da nicht Process::WaitForInputIdle eine Hilfe für dich?
Eiger 10.11.2011
Moin Eiger, ich habs gerade ausprobiert. Nein, geht nicht. WaitForIdleInput(n) läuft direkt weiter. Anscheinend hat der Prozess mehr als eine Nachrichtenschleife.
Karl 10.11.2011

Stelle deine .net-Frage jetzt!