1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
namespace Rainbird.Tools.COMInterop
{
/// <summary>
/// Ermöglicht .NET-Anwendungen direkten Zugriff auf die Running Object Table (Tabelle mit allen momentan laufenden COM-Objekte)
/// </summary>
public class RunningObjectTable
{
/// <summary>
/// Privater Standardkonstruktor.
/// </summary>
private RunningObjectTable() { }
// Win32-API-Aufruf zum lesen der ROT
[DllImport("ole32.dll")]
private static extern int GetRunningObjectTable(uint reserved, out IRunningObjectTable pprot);
// Win32-API-Aufruf zum erstellen von Bindungen
[DllImport("ole32.dll")]
private static extern int CreateBindCtx(uint reserved, out IBindCtx pctx);
/// <summary>
/// Gibt einen Verweis auf eine laufendes COM-Objekt anhand ihres Anzeigenamens zurück.
/// </summary>
/// <param name="objectDisplayName">Anzeigename einer COM-Instanz</param>
/// <returns>Verweis auf COM-Objekt, oder null, wenn kein COM-Objekt mit dem angegbenen Namen läuft</returns>
public static object GetRunningCOMObjectByName(string objectDisplayName)
{
// ROT-Schnittstelle
IRunningObjectTable runningObjectTable = null;
// Moniker-Auflistung
IEnumMoniker monikerList = null;
try
{
// Running Object Table abfragen und nichts zurückgeben, wenn keine COM-Objekte laufen
if (GetRunningObjectTable(0, out runningObjectTable) != 0 || runningObjectTable == null) return null;
// Moniker abfragen
runningObjectTable.EnumRunning(out monikerList);
// An den Anfang der Auflistung springen
monikerList.Reset();
// Array für Moniker-Abfrage erzeugen
IMoniker[] monikerContainer = new IMoniker[1];
// Zeiger auf die Anzahl der tatsächlich abgefragten Moniker erzeugen
IntPtr pointerFetchedMonikers = IntPtr.Zero;
// Alle Moniker durchlaufen
while (monikerList.Next(1, monikerContainer, pointerFetchedMonikers) == 0)
{
// Objekt für Bindungsinformationen
IBindCtx bindInfo;
// Variable für den Anzeigenamen des aktuellen COM-Objekts
string displayName;
// Bindungsobjekt erzeugen
CreateBindCtx(0, out bindInfo);
// Anzeigename des COM-Objekts über den Moniker abfragen
monikerContainer[0].GetDisplayName(bindInfo, null, out displayName);
// Bindungsobjekt entsorgen
Marshal.ReleaseComObject(bindInfo);
// Wenn der Anzeigename mit dem gesuchten übereinstimmt ...
if (displayName.IndexOf(objectDisplayName) != -1)
{
// Variable für COM-Objekt
object comInstance;
// COM-Objekt über den Anzeigenamen abrfragen
runningObjectTable.GetObject(monikerContainer[0], out comInstance);
// COM-Objekt zurückgeben
return comInstance;
}
}
}
catch
{
// Nichts zurückgeben
return null;
}
finally
{
// Ggf. COM-Verweise entsorgen
if (runningObjectTable != null) Marshal.ReleaseComObject(runningObjectTable);
if (monikerList != null) Marshal.ReleaseComObject(monikerList);
}
// Nichts zurückgeben
return null;
}
/// <summary>
/// Gibt eine Liste mit Anzeigenamen aller momentan laufenden COM-Objekte zurück.
/// </summary>
/// <returns>Liste mit Anzeigenamen</returns>
public static IList<string> GetRunningCOMObjectNames()
{
// Auflistung der Anzeigenamen erzeugen
IList<string> result = new List<string>();
// Informationsobjekt der laufenden COM-Instanzen
IRunningObjectTable runningObjectTable = null;
// Moniker-Auflistung
IEnumMoniker monikerList = null;
try
{
// Running Object Table abfragen und nichts zurückgeben, wenn keine COM-Objekte laufen
if (GetRunningObjectTable(0, out runningObjectTable) != 0 || runningObjectTable == null) return null;
// Moniker abfragen
runningObjectTable.EnumRunning(out monikerList);
// An den Anfang der Auflistung springen
monikerList.Reset();
// Array für Moniker-Abfrage erzeugen
IMoniker[] monikerContainer = new IMoniker[1];
// Zeiger auf die Anzahl der tatsächlich abgefragten Moniker erzeugen
IntPtr pointerFetchedMonikers = IntPtr.Zero;
// Alle Moniker durchlaufen
while (monikerList.Next(1, monikerContainer, pointerFetchedMonikers) == 0)
{
// Objekt für Bindungsinformationen
IBindCtx bindInfo;
// Variable für den Anzeigenamen des aktuellen COM-Objekts
string displayName;
// Bindungsobjekt erzeugen
CreateBindCtx(0, out bindInfo);
// Anzeigename des COM-Objekts über den Moniker abfragen
monikerContainer[0].GetDisplayName(bindInfo, null, out displayName);
// Bindungsobjekt entsorgen
Marshal.ReleaseComObject(bindInfo);
// Anzeigenamen der Auflistung zufügen
result.Add(displayName);
}
// Auflistung zurückgeben
return result;
}
catch
{
// Nichts zurückgeben
return null;
}
finally
{
// Ggf. COM-Verweise entsorgen
if (runningObjectTable != null) Marshal.ReleaseComObject(runningObjectTable);
if (monikerList != null) Marshal.ReleaseComObject(monikerList);
}
}
}
}
|