Marshal.GetActiveObject(String) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает запущенный экземпляр указанного объекта из запущенной таблицы объектов (ROT).
public:
static System::Object ^ GetActiveObject(System::String ^ progID);
public static object GetActiveObject(string progID);
[System.Security.SecurityCritical]
public static object GetActiveObject(string progID);
static member GetActiveObject : string -> obj
[<System.Security.SecurityCritical>]
static member GetActiveObject : string -> obj
Public Shared Function GetActiveObject (progID As String) As Object
Параметры
- progID
- String
Программный идентификатор (ProgID) запрошенного объекта.
Возвращаемое значение
Запрошенный объект; в противном случае null. Этот объект можно привести к любому интерфейсу COM, который он поддерживает.
- Атрибуты
Исключения
Объект не найден.
Примеры
Следующий пример был запущен на компьютере, который был настроен с запущенным экземпляром Microsoft Word. Не было экземпляров Microsoft Excel запущенных.
В примере дважды вызывается GetActiveObject . Первый вызов пытается получить ссылку на экземпляр Microsoft Word (экземпляр объекта Word.Application). Второй вызов пытается получить ссылку на экземпляр Microsoft Excel (экземпляр объекта Excel.Application).
Код извлекает ссылку на экземпляр Microsoft Word успешно. Однако, поскольку Microsoft Excel не выполняется, попытка получить второй объект вызывает COMException.
using System;
using System.Runtime.InteropServices;
class MainFunction
{
static void Main()
{
Console.WriteLine("\nSample: C# System.Runtime.InteropServices.Marshal.GetActiveObject.cs\n");
GetObj(1, "Word.Application");
GetObj(2, "Excel.Application");
}
static void GetObj(int i, String progID)
{
Object obj = null;
Console.WriteLine("\n" +i+") Object obj = GetActiveObject(\"" + progID + "\")");
try
{ obj = Marshal.GetActiveObject(progID); }
catch (Exception e)
{
Write2Console("\n Failure: obj did not get initialized\n" +
" Exception = " +e.ToString().Substring(0,43), 0);
}
if (obj != null)
{ Write2Console("\n Success: obj = " + obj.ToString(), 1 ); }
}
static void Write2Console(String s, int color)
{
Console.ForegroundColor = color == 1? ConsoleColor.Green : ConsoleColor.Red;
Console.WriteLine(s);
Console.ForegroundColor = ConsoleColor.Gray;
}
}
/*
Expected Output:
Sample: C# System.Runtime.InteropServices.Marshal.GetActiveObject.cs
1) Object obj = GetActiveObject("Word.Application")
Success: obj = System.__ComObject
2) Object obj = GetActiveObject("Excel.Application")
Failure: obj did not get initialized
Exception = System.Runtime.InteropServices.COMException
*/
Imports System.Runtime.InteropServices
Module Module1
Sub Main()
Console.WriteLine(vbcrlf + "Sample: VB System.Runtime.InteropServices.Marshal.GetActiveObject.vb" + vbcrlf)
GetObj(1, "Word.Application")
GetObj(2, "Excel.Application")
End Sub
Sub GetObj(ByVal i As Integer, ByVal progID As [String])
Dim obj As [Object] = Nothing
Console.WriteLine((vbLf & i & ") Object obj = GetActiveObject(""") + progID & """)")
Try
obj = Marshal.GetActiveObject(progID)
Catch e As Exception
Write2Console((vbLf & " Failure: obj did not get initialized" & vbLf & " Exception = ") + e.ToString().Substring(0, 43), 0)
End Try
If obj IsNot Nothing Then
Write2Console(vbLf & " Success: obj = " & obj.ToString(), 1)
End If
End Sub
Sub Write2Console(ByVal s As [String], ByVal color As Integer)
Console.ForegroundColor = If(color = 1, ConsoleColor.Green, ConsoleColor.Red)
Console.WriteLine(s)
Console.ForegroundColor = ConsoleColor.Gray
End Sub
End Module
'Expected Output:
'
'Sample: VB System.Runtime.InteropServices.Marshal.GetActiveObject.vb
'
'1) Object obj = GetActiveObject("Word.Application")
'
' Success: obj = System.__ComObject
'
'2) Object obj = GetActiveObject("Excel.Application")
'
' Failure: obj did not get initialized
' Exception = System.Runtime.InteropServices.COMException
'
Комментарии
GetActiveObject предоставляет функцию COM GetActiveObject из OLEAUT32.DLL; однако последний ожидает идентификатор класса (CLSID) вместо программного идентификатора (ProgID), ожидаемого этим методом. Чтобы получить запущенный экземпляр COM-объекта без зарегистрированного ProgID, используйте вызов платформы для определения функции COM GetActiveObject . Описание вызова платформы см. в разделе "Использование неуправляемых функций DLL".
ProgID и CLSID
Ключи в поддереве реестра HKEY_CLASSES_ROOT содержат различные типы подключей. Большинство вложенных ключей — это ProgID, которые сопоставляют удобочитаемую строку с CLSID. Приложения часто используют эти читаемые пользователем строки вместо числовых CLSID. Часто компонент имеет независимый от версии ProgID, сопоставленный с последней версией компонента, установленного в системе.
Приложения и компоненты в основном используют progID для получения соответствующих CLSID.