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_SURROGATE 和 SXS_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
备注
此函数没有关联的导入库或头文件;必须使用 LoadLibrary 和 GetProcAddress 函数调用它。
托管组件可以将自身声明为支持托管的“互操作程序集”,以便允许非托管 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 |
包含以下两个标志值之一:
|
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 |
|
请参阅