Partager via


Fonction SxsLookupClrGuid

Récupère le nom de classe et d’autres informations associées à un GUID donné dans le manifeste d’un composant. Cette fonction est utilisée uniquement lors de l’implémentation de l’interopérabilité managée non managée de bas niveau dans le .NET Framework. Pour plus d’informations sur l’interopérabilité managée-non managée, consultez « Interopérabilité avec du code non managé » dans le Kit de développement logiciel (SDK) .NET Framework, ainsi que sur les applications isolées et les assemblys côte à côte.

Syntaxe

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

Paramètres

dwFlags [in]

Combinaison de zéro ou plus des indicateurs suivants.

Valeur Signification
SXS_LOOKUP_CLR_GUID_USE_ACTCTX
0x00000001
Si cet indicateur est défini, le paramètre hActCtx doit contenir un handle de contexte d’activation retourné par la fonction CreateActCtx . Si cet indicateur n’est pas défini, le paramètre hActCtx est ignoré et SxsLookupClrGuid recherche le contexte d’activation actuellement actif (la fonction ActivateActCtx est utilisée pour activer un contexte d’activation).
SXS_LOOKUP_CLR_GUID_FIND_SURROGATE
0x00010000
Si cet indicateur est défini, SxsLookupClrGuid recherche un substitut.
SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS
0x00020000
Si cet indicateur est défini, SxsLookupClrGuid recherche une classe.
SXS_LOOKUP_CLR_GUID_FIND_ANY
0x00030000
Il s’agit d’une combinaison des indicateurs SXS_LOOKUP_CLR_GUID_FIND_SURROGATE et SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS ; si les deux sont définis, SxsLookupClrGuid recherche d’abord un substitut, et seulement s’il n’en trouve pas, recherche ensuite une classe.

 

pClsid [in]

Pointeur vers le GUID sur lequel rechercher des informations d’interopérabilité dans le contexte d’activation. Ce paramètre ne peut pas avoir la valeur NULL.

hActCtx [in, facultatif]

Si l’indicateur SXS_LOOKUP_CLR_GUID_USE_ACTCTX est défini dans le paramètre dwFlags , hActCtx doit contenir un handle de contexte d’activation retourné par la fonction CreateActCtx . Sinon, hActCtx est ignoré.

pvOutputBuffer [in, out, optional]

Pointeur vers la mémoire tampon dans laquelle les informations de retour sont copiées. Ce paramètre peut avoir une valeur NULL uniquement si le paramètre cbOutputBuffer a une valeur nulle. Les données placées dans cette mémoire tampon à la sortie (le cas échéant) se composent d’une structure SXS_GUID_INFORMATION_CLR suivie de toutes les données de chaîne supplémentaires requises. Pour plus d’informations, consultez la section Remarques ci-dessous.

cbOutputBuffer [in]

Taille en octets de la mémoire tampon pointée vers le paramètre pvOutputBuffer .

pcbOutputBuffer [out]

Pointeur vers une variable où la taille, en octets, des informations de retour est placée à la sortie. Si le paramètre cbOutputBuffer est égal à zéro ou si la taille de la mémoire tampon de sortie est inférieure à la taille des informations de retour, SxsLookupClrGuid échoue et GetLastError retourne une erreur de ERROR_INSUFFICIENT_BUFFER. Dans ce cas, utilisez la valeur dans la variable pointée par pcbOutputBuffer pour allouer une mémoire tampon suffisamment grande, puis appelez à nouveau SxsLookupClrGuid pour récupérer les informations souhaitées.

Valeur retournée

Retourne LA valeur TRUE si elle réussit ou FALSE dans le cas contraire. Pour plus d’informations sur l’erreur, appelez GetLastError

Notes

Cette fonction n’a aucune bibliothèque d’importation ou fichier d’en-tête associé ; vous devez l’appeler à l’aide des fonctions LoadLibrary et GetProcAddress .

Les composants managés peuvent se déclarer comme prenant en charge les « assemblys d’interopérabilité » managés afin de permettre à un consommateur de composants Win32 non managé de référencer l’assembly déclarant. Le consommateur de composants peut interagir avec le composant managé en appelant CoCreateInstance sur un GUID. La couche d’interopérabilité achemine la demande de création d’objet vers .NET Framework, crée un instance de l’objet managé et retourne un pointeur d’interface.

SxsLookupClrGuid permet aux frameworks de récupérer des informations associées à un GUID donné dans le manifeste du composant, telles que le nom de sa classe .NET, la version du .NET Framework dont il a besoin et l’assembly hôte dans lequel il se trouve. Les composants managés publient un assembly d’interopérabilité qui contient un certain nombre d’instructions associant des GUID avec des noms d’assembly et de type, et le runtime .NET répartit la construction d’instances d’objets managés lorsque CoCreateInstance est appelé.

Voici un exemple de manifeste de composant déclarant un GUID CLR et une substitution CLR que SxsLookupClrGuid peut rechercher :

<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>

Un fournisseur d’interopérabilité appelle SxsLookupClrGuid avec un pointeur vers le GUID « {fdb46ca5-9477-4528-b4b2-7f00a254cdea} », et recevaient en retour le nom de classe « MySampleSurrogate », la version d’exécution requise « 1.0.3055 » et l’identité textuelle « DotNet.Sample.Surrogates,version='1.0.0.0',type='interop' » du composant d’hébergement.

Ces informations de retour sont contenues et/ou référencées par une structure de SXS_GUID_INFORMATION_CLR déclarée comme suit.

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;

Les membres de cette structure contiennent les informations suivantes.

Membre Description
cbSize
Contient la taille de la structure SXS_GUID_INFORMATION_CLR (cela permet à la structure de croître dans les versions ultérieures).
dwFlags
Contient l’une des deux valeurs d’indicateur suivantes :
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE (0x00000001) : indique que le GUID spécifié a été associé à un « substitut ».
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS (0x00000002) : indique que le GUID spécifié a été associé à une « classe ».
pcwszRuntimeVersion
Pointe vers une chaîne de caractères larges sans fin qui identifie la version du runtime spécifiée dans le manifeste de l’hôte pour cette classe.
pcwszTypeName
Pointe vers une chaîne de caractères larges sans fin qui contient le nom de la classe .NET associée au GUID spécifié.
pcwszAssemblyIdentity
Pointe vers une chaîne de caractères larges sans fin qui contient l’identité textuelle de l’assembly qui héberge cette classe. Pour plus d’informations sur l’identité textuelle, consultez « Spécification de noms de types complets » sous « Découverte des informations de type au moment de l’exécution » sous « Programmation avec le .NET Framework » dans le Kit de développement logiciel (SDK) .NET Framework.

 

Une application non managée peut utiliser les informations retournées de cette façon pour charger la version appropriée du .NET Framework, charger l’assembly identifié par l’élément pcwszAssemblyIdentity, puis créer un instance de la classe nommée par l’élément pcwszTypeName.

Exemples

Utilisez la liaison dynamique comme suit pour appeler la fonction 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 );
  }
}

Spécifications

Condition requise Valeur
DLL
Mscoree.dll;
Sxs.dll

Voir aussi

Applications isolées et assemblys côte à côte

CreateActCtx

ActivateActCtx

CoCreateInstance