none
COM Server RRS feed

  • Frage

  • Hi,

    ich habe einen COM-Exe-Server mit c# erstellt...funktioniert alles tadellos, jeder, der sich zu mir verbindet bekommt seine Klasse...aber

    kann ich feststellen:

    - aus welchem Programm sich verbunden wurde (am besten Task-ID oder Prozess-ID)?

    - ob die Verbindung noch aktiv ist (destruktor der Klasse wird leider nicht aufgerufen, wenn das andere Programm abstürzt oder durch taskkill beendet wird)?

    Da ich gerne anzeigen würde, wer noch mit mir verbunden ist, wären diese Infos echt toll.

     

    Gruß

     

    udo

     

    Sonntag, 27. März 2011 17:48

Antworten

Alle Antworten

  • Hallo Udo,

    Meines Wissens nach in der Form nicht möglich.

    [Determine COM Client Process ID within COM Server]
    http://www.ureader.com/msg/1478710.aspx

    Insofern sollte der Client zum Beispiel eine Methode aufrufen, in der die Prozess-ID steht oder davon ableitbar ist.
    Der Client würde ja aber ggf. eine Schliessen/Quit Methode aufrufen.

    Ansonsten ggf. den Reference-Count im ROT auswerten:

    [Laufende Visual Studio Instanz filtern]
    http://dzaebel.net/VsInstanz.htm 


    ciao Frank
    Sonntag, 27. März 2011 18:23
  • Leider hilft mir das alles irtgendwie nicht.

     

    naja..egal.

     

    Gruß

     

    udo

    Mittwoch, 6. April 2011 11:01
  • Leider hilft mir das alles irtgendwie nicht.

    Evtl. solltest Du dann anfangen, über Alternativen in deinem Handling nachzudenken. Wenn es dein Programm so sehr stört, dass irgendwo irgendwelche Fehler passieren, stimmt eher etwas mit deiner Anwendung nicht.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Mittwoch, 6. April 2011 14:16
    Moderator
  • leider können sich mit meinem Programm irgendwelche Kundenprogramme oder Scripte connecten, mit eigenentwicklungen usw., daher kann ich über die qualität der Programme oder scripte nix sagen.

     

    Gruß

    Udo

    Donnerstag, 7. April 2011 09:55
  • Hi,

    leider können sich mit meinem Programm irgendwelche Kundenprogramme oder Scripte connecten, mit eigenentwicklungen usw., daher kann ich über die qualität der Programme oder scripte nix sagen.

    ich meinte deine Anwendung, nicht die, die sich damit verbinden.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Donnerstag, 7. April 2011 16:09
    Moderator
  • Hallo P.,

    es hilft "Dir" ggf. nicht, weil Du es nicht machst, kannst, oder umsetzen möchtest - das ist aber Deine Sache.
    Die von mir angegebenen Möglichkeiten sind schon für das Problem ~angemessene Verfahren.
    Du kannst zum Beispiel durch Factory Struktur sauber über OOP erzwingen, dass bestimmte Methoden aufgerufen werden müssen.

    ______________________________

    Ansonsten kann ggf. auch die brutale, aufwändige Methode benutzt werden, alle Prozesse zu durchlaufen und deren angezogene DLLs zu durchsuchen. Hier kommen aber Security-Aspekte zum Vorschein, die auch nicht immer lösbar sind. Dennoch hier ein grober Implementierungs-Ansatz:

       List<string> prozessNamen = new List<string>();
       string deinComServerDllPfad = Assembly.GetExecutingAssembly().Location;
       string deinComServerDllName = Path.GetFileName(deinComServerDllPfad);
       var prozesse = Process.GetProcesses();
       foreach (var proc in prozesse)
       {
        try
        {
         var modules = proc.Modules;
         foreach (ProcessModule modul in modules)
         {
          if (modul.FileName == deinComServerDllPfad)
          {
           prozessNamen.Add(proc.ProcessName);
           break;
          }
         }
        }
        catch { }
       }
       if (prozessNamen.Count > 0)
        Console.WriteLine("\r\n Die DLL '" + deinComServerDllName +
        "' wurde in folgenden Prozessen geladen:\r\n" +
        string.Join(", ", prozessNamen));
       else
        Console.WriteLine("\r\n Die DLL '" + deinComServerDllName +
        "' wurde in keinem Prozess geladen!\r\n");
    

    ich meine mich aber zu erinnern, dass COM-Dlls erst mal gar in dieser Liste auftauchen.
    _____________________

    Eine C++ Hack-Methode könnte auch ein Stack-Backtrace sein ... etwa so:

    // Must have in order for us to turned address into module name.
    SymInitialize(GetCurrentProcess(), NULL , TRUE);
    // Limitation of RtlCaptureStackBackTrace.
    const int kMaxCallers = 62; 
    void* callers[kMaxCallers];
    int count = RtlCaptureStackBackTrace(0, kMaxCallers, callers, NULL);
    for (int i = 0; i < count; i++) 
    {  
       TCHAR szBuffer[50];  
       DWORD64 dwBaseAddress = SymGetModuleBase64(GetCurrentProcess(), 
          (DWORD64)callers[i]);  
       GetModuleBaseName(GetCurrentProcess(), (HMODULE) dwBaseAddress, szBuffer, sizeof(szBuffer)); 
       std::wcout << _T("--->") << szBuffer << std::endl;
    }


    Das Einhaken in die Prozess-Erzeugungs-Ereignisse über WMI würde aber bei Deinem Exe-Server nur das erste mal funktionieren, denn danach fungiert ja der Out-Process Server selber als Host für die Client-Instanzen:

    [Using WMI to monitor process creation, deletion and modification in .NET - Wes' Puzzling Blog]
    http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx

    ______________________

    COM CoCreateInterface Hooking: [Application architecture research - CodeProject]
    http://www.codeproject.com/KB/recipes/architecture-research.aspx

    Allgemeines: [COM Technical Overview (COM)]
    http://msdn.microsoft.com/en-us/library/ff637359(VS.85).aspx

    COM Server: [COM-Interop Teil 2: C#-Serverlernprogramm (C#)]
    http://msdn.microsoft.com/de-de/libra

    Donnerstag, 7. April 2011 18:23
  • Danke

     

    Gruß

    Udo

    • Als Antwort markiert Posbis_ Sonntag, 10. April 2011 15:28
    Freitag, 8. April 2011 13:50
  • Hallo Udo,

    • Danke

    gerne, dann kannst Du es hier beenden.


    ciao Frank
    Freitag, 8. April 2011 17:34