Функция SxsLookupClrGuid
Извлекает имя класса и другие сведения, связанные с заданным ИДЕНТИФИКАТОРом GUID в манифесте компонента. Эта функция используется только при реализации низкоуровневого управляемого неуправляемого взаимодействия в платформа .NET Framework. Дополнительные сведения об управляемом и неуправляемом взаимодействии см. в разделе Взаимодействие с неуправляемыми кодами в пакете SDK для платформа .NET Framework, а также изолированные приложения и параллельные сборки.
Синтаксис
BOOL SxsLookupClrGuid(
_In_ DWORD dwFlags,
_In_ LPGUID pClsid,
_In_opt_ HANDLE hActCtx,
_Inout_opt_ PVOID pvOutputBuffer,
_In_ SIZE_T cbOutputBuffer,
_Out_ PSIZE_T pcbOutputBuffer
);
Параметры
-
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, необязательный]
-
Если флаг SXS_LOOKUP_CLR_GUID_USE_ACTCTX задан в параметре dwFlags , то hActCtx должен содержать дескриптор контекста активации, возвращаемый функцией CreateActCtx . В противном случае hActCtx игнорируется.
-
pvOutputBuffer [in, out, optional]
-
Указатель на буфер, в который копируются возвращаемые сведения. Этот параметр может иметь значение NULL, только если параметр cbOutputBuffer имеет нулевое значение. Данные, помещенные в этот буфер при выходе (если таковые есть), состоят из SXS_GUID_INFORMATION_CLR структуры, за которой следуют все необходимые дополнительные строковые данные. Дополнительные сведения см. в разделе Примечания ниже.
-
cbOutputBuffer [in]
-
Размер буфера в байтах, на который указывает параметр pvOutputBuffer .
-
pcbOutputBuffer [out]
-
Указатель на переменную, в которой размер возвращаемой информации в байтах помещается при выходе. Если параметр cbOutputBuffer равен нулю или размер выходного буфера меньше размера возвращаемой информации, то SxsLookupClrGuid завершается сбоем и GetLastError возвращает ошибку ERROR_INSUFFICIENT_BUFFER. В этом случае используйте значение в переменной, на которую указывает pcbOutputBuffer , чтобы выделить достаточно большой буфер, а затем снова вызовите SxsLookupClrGuid , чтобы получить нужные сведения.
Возвращаемое значение
Возвращает значение TRUE в случае успешного выполнения или FALSE в противном случае. Для получения дополнительных сведений об ошибке вызовите Метод GetLastError.
Комментарии
У этой функции нет связанной библиотеки импорта или файла заголовка; его необходимо вызвать с помощью функций LoadLibrary и GetProcAddress .
Управляемые компоненты могут объявлять себя как поддерживающие управляемые "сборки взаимодействия", чтобы позволить неуправляемым потребителю компонента Win32 ссылаться на объявляющую сборку. Потребитель компонента может взаимодействовать с управляемым компонентом, вызывая CoCreateInstance по идентификатору GUID. Слой взаимодействия направляет запрос на создание объекта в платформа .NET Framework, создает экземпляр управляемого объекта и возвращает указатель интерфейса.
SxsLookupClrGuid позволяет платформам получать сведения, связанные с заданным GUID в манифесте компонента, например имя класса .NET, требуемую версию платформа .NET Framework и сборку узла, в которой она находится. Управляемые компоненты публикуют сборку взаимодействия, содержащую ряд инструкций, связывающих GUID с именами сборок и типов, а среда выполнения .NET создает экземпляры управляемых объектов при вызове CoCreateInstance .
Ниже приведен пример манифеста компонента, объявляющего GUID CLR и суррогат 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>
Поставщик взаимодействия вызывает SxsLookupClrGuid с указателем на GUID "{fdb46ca5-9477-4528-b4b2-7f00a254cdea}", и получат в ответ имя класса 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 |
Указывает на строку расширенных символов с нулем, содержащую имя класса .NET, связанное с указанным GUID. |
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 |
|
См. также раздел