Benutzer mit den meisten Antworten
COM Server

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
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 -
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 -
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 -
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.aspxAllgemeines: [COM Technical Overview (COM)]
http://msdn.microsoft.com/en-us/library/ff637359(VS.85).aspxCOM Server: [COM-Interop Teil 2: C#-Serverlernprogramm (C#)]
http://msdn.microsoft.com/de-de/libra