Marshal.GetActiveObject(String) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
从正在运行的对象表(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 从 OLEAUT32.DLL 公开 COM GetActiveObject 函数;但是,后者需要类标识符(CLSID),而不是此方法预期的编程标识符(ProgID)。 若要在没有注册 ProgID的情况下获取 COM 对象的正在运行的实例,请使用平台调用来定义 COM GetActiveObject 函数。 有关平台调用的说明,请参阅 使用非托管 DLL 函数。
ProgID 和 CLSID
注册表HKEY_CLASSES_ROOT子树中的键包含各种子项类型。 大多数子键是 ProgID,它们将用户友好的字符串映射到 CLSID。 应用程序通常使用这些可读字符串,而不是数字 CLSID。 通常,组件具有与版本无关的 ProgID,该 ID 映射到系统上安装的组件的最新版本。
应用程序和组件主要使用 ProgID 检索对应的 CLSID。