SxsLookupClrGuid 函数

检索类名以及与组件清单中给定 GUID 关联的其他信息。 仅当在.NET Framework中实现低级别的托管-非托管互操作性时,才使用此函数。 有关托管-非托管互操作性的详细信息,请参阅 .NET Framework SDK 中的“与非托管代码互操作”,以及独立应用程序和并行程序集

语法

BOOL SxsLookupClrGuid(
  _In_        DWORD   dwFlags,
  _In_        LPGUID  pClsid,
  _In_opt_    HANDLE  hActCtx,
  _Inout_opt_ PVOID   pvOutputBuffer,
  _In_        SIZE_T  cbOutputBuffer,
  _Out_       PSIZE_T pcbOutputBuffer
);

parameters

dwFlags [in]

以下零个或多个标志的组合。

含义
SXS_LOOKUP_CLR_GUID_USE_ACTCTX
0x00000001
如果设置了此标志,则 hActCtx 参数必须包含 CreateActCtx 函数返回的激活上下文句柄。 如果未设置此标志,则忽略 hActCtx 参数,并且 SxsLookupClrGuid 将搜索当前处于活动状态的激活上下文 (ActivateActCtx 函数用于激活上下文) 。
SXS_LOOKUP_CLR_GUID_FIND_SURROGATE
0x00010000
如果设置了此标志, SxsLookupClrGuid 将搜索代理项。
SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS
0x00020000
如果设置了此标志, 则 SxsLookupClrGuid 将搜索类。
SXS_LOOKUP_CLR_GUID_FIND_ANY
0x00030000
这是 SXS_LOOKUP_CLR_GUID_FIND_SURROGATESXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS 标志的组合;如果两者均已设置, 则 SxsLookupClrGuid 首先搜索代理项,并且仅当找不到代理项时,才搜索类。

 

pClsid [in]

指向 GUID 的指针,用于在激活上下文中搜索互操作信息。 此参数不能为 NULL

hActCtx [in, optional]

如果在 dwFlags 参数中设置了SXS_LOOKUP_CLR_GUID_USE_ACTCTX标志,则 hActCtx 必须包含 CreateActCtx 函数返回的激活上下文句柄。 否则,将忽略 hActCtx

pvOutputBuffer [in, out, optional]

指向将返回信息复制到其中的缓冲区的指针。 仅当 cbOutputBuffer 参数为零值时,此参数才能为 NULL 值。 如果任何) 包含 SXS_GUID_INFORMATION_CLR结构后 跟所需的任何其他字符串数据,则退出时放置在此缓冲区中的数据 (。 有关详细信息,请参阅下面的备注部分。

cbOutputBuffer [in]

pvOutputBuffer 参数指向的缓冲区的大小(以字节为单位)。

比方输出Buffer [out]

指向变量的指针,其中返回信息的大小(以字节为单位)放置在退出时。 如果 cbOutputBuffer 参数为零,或者输出缓冲区的大小小于返回信息的大小,则 SxsLookupClrGuid 将失败, GetLastError 将返回 错误ERROR_INSUFFICIENT_BUFFER。 在本例中,请使用 由示例输出Buffer 指向的变量中的值来分配足够大的缓冲区,然后再次调用 SxsLookupClrGuid 以检索所需的信息。

返回值

如果成功,则返回 TRUE ,否则返回 FALSE 。 有关更多错误信息,请调用 GetLastError

备注

此函数没有关联的导入库或头文件;必须使用 LoadLibraryGetProcAddress 函数调用它。

托管组件可以将自身声明为支持托管的“互操作程序集”,以便允许非托管 Win32 组件使用者引用声明程序集。 组件使用者可以通过在 GUID 上调用 CoCreateInstance 来与托管组件交互。 互操作层将对象创建请求路由到.NET Framework,创建托管对象的实例,并返回接口指针。

SxsLookupClrGuid 允许框架检索与组件清单中给定 GUID 关联的信息,例如其 .NET 类名称、所需的.NET Framework版本以及它所在的主机程序集。 托管组件发布一个互操作程序集,其中包含许多语句,这些语句将 GUID 与程序集和类型名称相关联,并且 .NET 运行时在调用 CoCreateInstance 时代理托管对象实例的构造。

下面是声明 CLR GUID 和 CLR 代理项(SxsLookupClrGuid 可以查找)的示例组件清单:

<assembly manifestVersion="1.0" xmlns=
    "urn:schemas-microsoft-com:asm.v1">
   <assemblyIdentity type="interop" name=
    "DotNet.Sample.Surrogates" version="1.0.0.0"/>
   <clrClass name="MySampleClass" clsid=
    "{19f7f420-4cc5-4b0d-8a82-c24645c0ba1f}"
      progId="MySampleClass.1" runtimeVersion="1.0.3055"/>
   <clrSurrogate name="MySampleSurrogate" clsid=
    "{fdb46ca5-9477-4528-b4b2-7f00a254cdea}"
      runtimeVersion="1.0.3055"/>
</assembly>

互操作提供程序将使用指向 GUID“{fdb46ca5-9477-4528-b4b2-7f00a254cdea}”的指针调用 SxsLookupClrGuid , 和 将收到返回的类名“MySampleSurrogate”、所需的运行时版本“1.0.3055”和承载组件的文本标识“DotNet.Sample.Surrogates,version='1.0.0.0',type='interop'”。

此返回信息将由声明如下 的SXS_GUID_INFORMATION_CLR 结构包含和/或引用。

typedef struct _SXS_GUID_INFORMATION_CLR
{
  DWORD   cbSize;
  DWORD   dwFlags;
  PCWSTR  pcwszRuntimeVersion;
  PCWSTR  pcwszTypeName;
  PCWSTR  pcwszAssemblyIdentity;
} SXS_GUID_INFORMATION_CLR, *PSXS_GUID_INFORMATION_CLR;
typedef const SXS_GUID_INFORMATION_CLR *PCSXS_GUID_INFORMATION_CLR;

此结构的成员包含以下信息。

成员 说明
cbSize
包含SXS_GUID_INFORMATION_CLR结构的大小, (这允许结构在更高版本中) 增长。
dwFlags
包含以下两个标志值之一:
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE (0x00000001) :指示指定的 GUID 与“代理项”相关联。
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS (0x00000002) :指示指定的 GUID 与“类”相关联。
pcwszRuntimeVersion
指向以零结尾的宽字符字符串,该字符串标识此类的主机清单中指定的运行时版本。
pcwszTypeName
指向以零结尾的宽字符字符串,该字符串包含与指定 GUID 关联的 .NET 类的名称。
pcwszAssemblyIdentity
指向一个以零结尾的宽字符字符串,该字符串包含承载此类的程序集的文本标识。 有关文本标识的详细信息,请参阅 .NET Framework SDK 中“使用.NET Framework编程”下的“在运行时发现类型信息”下的“指定完全限定的类型名称”。

 

非托管应用程序可以使用以这种方式返回的信息加载正确版本的.NET Framework,加载由 pcwszAssemblyIdentity 元素标识的程序集,然后创建由 pcwszTypeName 元素命名的类的实例。

示例

按如下所示使用动态链接来调用 SxsLookupClrGuid 函数:

#include <windows.h>

// Declare a type for a SxsLookupClrGuid function pointer:
typedef BOOL (WINAPI* PFN_SXS_LOOKUP_CLR_GUID)
    ( IN DWORD      dwFlags,
    IN LPGUID     pClsid,
    IN HANDLE     hActCtx,
    IN OUT PVOID  pvOutputBuffer,
    IN SIZE_T     cbOutputBuffer,
    OUT PSIZE_T   pcbOutputBuffer );

// Declare an actual function pointer
PFN_SXS_LOOKUP_CLR_GUID pfn_SxsLookupClrGuid;

// Declare a handle for the system DLL
HINSTANCE hSxsDll;

// Other declarations:
BOOL isOK;
GUID exampleGuid = 
{0xFDB46CA5, 0x9477, 0x4528, 0xB4, 0xB2, 
    0x7F, 0x00, 0xA2, 0x54, 0xCD, 0xEA};
#define  OUTPUT_BUFFER_SIZE  512
unsigned char outputBuffer[OUTPUT_BUFFER_SIZE];
SIZE_T neededBufferSize;
DWORD errorCode;

#define SXS_LOOKUP_CLR_GUID_USE_ACTCTX       (0x00000001)
#define SXS_LOOKUP_CLR_GUID_FIND_SURROGATE   (0x00010000)
#define SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS   (0x00020000)
#define SXS_LOOKUP_CLR_GUID_FIND_ANY         (0x00030000) 
    // (SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS | 
    //    SXS_LOOKUP_CLR_GUID_FIND_SURROGATE)

#define SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE  (0x00000001)
#define SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS      (0x00000002)

typedef struct _SXS_GUID_INFORMATION_CLR
{
    DWORD       cbSize;
    DWORD       dwFlags;
    PCWSTR      pcwszRuntimeVersion;
    PCWSTR      pcwszTypeName;
    PCWSTR      pcwszAssemblyIdentity;
} SXS_GUID_INFORMATION_CLR, *PSXS_GUID_INFORMATION_CLR;
typedef const SXS_GUID_INFORMATION_CLR *PCSXS_GUID_INFORMATION_CLR;

void main()
{
// Use LoadLibrary to obtain a handle to the "SXS.DLL" system library
  hSxsDll = LoadLibrary( "sxs" );

// If SXS.DLL has loaded properly, 
// try to obtain a pointer to SxsLookupClrGuid
  if( hSxsDll != NULL )
  {
    pfn_SxsLookupClrGuid = (PFN_SXS_LOOKUP_CLR_GUID) GetProcAddress(
                            hSxsDll, "SxsLookupClrGuid" );
    if( pfn_SxsLookupClrGuid == NULL )
    {
       // (Handle failure to find SxsLookupClrGuid here...)
    }
    else
    {
      isOK = (pfn_SxsLookupClrGuid)(
                 SXS_LOOKUP_CLR_GUID_FIND_ANY,     // dwFlags
                 &exampleGuid,                     // pClsid
                 NULL,                             // hActCtx
                 (PVOID) outputBuffer,             // pvOutputBuffer
                 (SIZE_T) OUTPUT_BUFFER_SIZE,      // cbOutputBuffer
                 &neededBufferSize );              // pcbOutputBuffer
      if( isOK == FALSE )
      {
        errorCode = GetLastError( );
        if( errorCode == ERROR_INSUFFICIENT_BUFFER )
        {
          // If the allocation fails because the buffer was too small,
          // allocate a larger output buffer, of the size 
          // now indicated by "neededBufferSize", and try again.
        }
        else
        {
          // Handle other errors here
        }
      }
      else
      {
        // (Use the information here...)
      }
    }
    // Free the library instance when you're done
    FreeLibrary( hSxsDll );
  }
}

要求

要求
DLL
Mscoree.dll;
Sxs.dll

请参阅

独立应用程序和并行程序集

CreateActCtx

ActivateActCtx

CoCreateInstance