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.

Применяется к