Laden...

ActiveX/Com Instanzen-Management: COM-Instanzen voneinander trennen o. d. Wiederverwendung verhind.

Erstellt von EgoFelix vor 10 Jahren Letzter Beitrag vor 10 Jahren 655 Views
E
EgoFelix Themenstarter:in
38 Beiträge seit 2009
vor 10 Jahren
ActiveX/Com Instanzen-Management: COM-Instanzen voneinander trennen o. d. Wiederverwendung verhind.

Hallo liebe myCSharp-Community!

Ich habe ein Problem mit dem Ansprechen bzw. Arbeiten mit verschiedenen COM-Servern.
In meinem Programm wird im Hintergrund eine Insanz z.B. von Word erstellt (Es geht nicht nur um Word, dies ist nur ein Beispiel) und dann bestimmte Operationen ausgeführt. Diese können auch etwas länger dauern (Die Zeit ist komplett variabel).

Nun habe ich folgendes Problem:
Währen im Hintergrund der COM-Prozess läuft und arbeitet, und der User im Explorer z.B. eine Datei öffnet, wird der besagte COM-Prozess "widerverwendet". Da ich diesen Prozess aber im Hintergrund verwende, wurden z.b. ggf. StatusMeldungen deaktiviert (Sonst ploppen plötzlich Dialoge auf).
D.h. der Prozess aus dem Hintergrund ist garnicht mehr richtig dafür geeignet vom User verwendet zu werden, geschweige denn im richtigen Zustand. Außerdem könnte der User die Datei, welche ich im Hintergrund geöffnet habe, einfach schließen, und somit die im Hintergrund ausführende Aktion zum Absturz bringen.

Hinzu kommt z.b. das man COM-Instanzen die man selber per CreateObject erstellt hat, auch wieder per Quit (Bei Word) schließen muss, da diese sonst als Zombie-Prozess im Taskmanager verbleiben. Hier kann nun aber plötzlich der Benutzer gerade in diesen Prozess eingreifen und auch arbeiten! Sollte dies der Fall sein, ist ein Quit keine gute Idee, da dies auch das aktuell vom Benutzer geöffnete Dokument schließen würde.

Meine Frage lautet nun:
Gibt es eine Möglichkeit, COM-Instanzen voneinander zu trennen, bzw. die Widerverwendung zu verhindern, damit der User eben die Datei z.B. nicht einfach während der laufenden Aktion schließen kann?

Mit freundlichen Grüßen
Felix

Edit:
Ich habe eben nochmal ein Beispiel geschrieben, um das Problem genauer zu erörtern.


using System;
using System.Collections.Generic;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Word = Microsoft.Office.Interop.Word;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("COM-Instanz-Problem");

            Type tWord = Type.GetTypeFromProgID("Word.Application");

            Word.Application oWord = (Word.Application)Activator.CreateInstance(tWord);

            Word.Document doc = oWord.Documents.Add();

            Console.WriteLine("Nun wird eine lange Aktion ausgeführt.... (jetzt z.b. Per Explorer eine Datei öffnen)");
            Console.ReadLine();

            doc.Close(false, Type.Missing, Type.Missing);
            oWord.Quit(false, Type.Missing, Type.Missing);
        }
    }
}


Desweiteren habe ich auch einen Post im Autodesk Forum gemacht, da ich das Problem erst beim Autodesk-Inventor vermutet habe...
Starting Inventor via Com - Closing will hold the Process open

Mit freundlichen Grüßen
Felix