Freigeben über


SxsLookupClrGuid-Funktion

Ruft den Klassennamen und andere Informationen ab, die einer bestimmten GUID im Manifest einer Komponente zugeordnet sind. Diese Funktion wird nur verwendet, wenn auf niedriger Ebene verwaltete nicht verwaltete Interoperabilität im .NET Framework implementiert wird. Weitere Informationen zur verwalteten und nicht verwalteten Interoperabilität finden Sie unter "Interoperating with Unmanaged Code" (Interoperating with Unmanaged Code) im .NET Framework SDK sowie unter Isolierte Anwendungen und parallele Assemblys.

Syntax

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

Parameter

dwFlags [in]

Eine Kombination aus null oder mehr der folgenden Flags.

Wert Bedeutung
SXS_LOOKUP_CLR_GUID_USE_ACTCTX
0x00000001
Wenn dieses Flag festgelegt ist, muss der hActCtx-Parameter ein Aktivierungskontexthandle enthalten, das von der CreateActCtx-Funktion zurückgegeben wird. Wenn dieses Flag nicht festgelegt ist, wird der hActCtx-Parameter ignoriert, und SxsLookupClrGuid durchsucht den derzeit aktiven Aktivierungskontext (die ActivateActCtx-Funktion wird verwendet, um einen Aktivierungskontext aktiv zu machen).
SXS_LOOKUP_CLR_GUID_FIND_SURROGATE
0x00010000
Wenn dieses Flag festgelegt ist, sucht SxsLookupClrGuid nach einem Ersatz.
SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS
0x00020000
Wenn dieses Flag festgelegt ist, sucht SxsLookupClrGuid nach einer Klasse.
SXS_LOOKUP_CLR_GUID_FIND_ANY
0x00030000
Dies ist eine Kombination aus SXS_LOOKUP_CLR_GUID_FIND_SURROGATE und SXS_LOOKUP_CLR_GUID_FIND_CLR_CLASS Flags. wenn beide festgelegt sind, sucht SxsLookupClrGuid zuerst nach einem Ersatz, und nur wenn es keins findet, sucht SxsLookupClrGuid nach einer Klasse.

 

pClsid [in]

Ein Zeiger auf die GUID, über die der Aktivierungskontext nach Interoperationsinformationen gesucht werden soll. Dieser Parameter darf nicht NULL sein.

hActCtx [in, optional]

Wenn das SXS_LOOKUP_CLR_GUID_USE_ACTCTX-Flag im dwFlags-Parameter festgelegt ist, muss hActCtx ein Aktivierungskontexthandle enthalten, das von der CreateActCtx-Funktion zurückgegeben wird. Andernfalls wird hActCtx ignoriert.

pvOutputBuffer [in, out, optional]

Zeiger auf den Puffer, in den zurückgegebene Informationen kopiert werden. Dieser Parameter kann nur nullwertig sein, wenn der cbOutputBuffer-Parameter nullwertig ist. Die Daten, die beim Beenden (sofern vorhanden) in diesem Puffer platziert werden, bestehen aus einer SXS_GUID_INFORMATION_CLR-Struktur gefolgt von allen erforderlichen zusätzlichen Zeichenfolgendaten. Weitere Informationen finden Sie im Abschnitt Hinweise unten.

cbOutputBuffer [in]

Größe in Bytes des Puffers, auf den der parameter pvOutputBuffer verweist.

pcbOutputBuffer [out]

Zeiger auf eine Variable, bei der die Größe der Rückgabeinformationen in Bytes beim Beenden platziert wird. Wenn der cbOutputBuffer-Parameter 0 ist oder die Größe des Ausgabepuffers kleiner als die Größe der Rückgabeinformationen ist, schlägt SxsLookupClrGuid fehl, und GetLastError gibt den Fehler ERROR_INSUFFICIENT_BUFFER zurück. Verwenden Sie in diesem Fall den Wert in der Variablen, auf die von pcbOutputBuffer verwiesen wird, um einen ausreichend großen Puffer zuzuweisen, und rufen Sie dann SxsLookupClrGuid erneut auf, um die gewünschten Informationen abzurufen.

Rückgabewert

Gibt TRUE zurück, wenn der Vorgang erfolgreich war, oder andernfalls FALSE . Rufen Sie GetLastError auf, um weitere Fehlerinformationen zu erhalten.

Bemerkungen

Diese Funktion verfügt über keine zugeordnete Importbibliothek oder Headerdatei. Sie müssen es mit den Funktionen LoadLibrary und GetProcAddress aufrufen.

Verwaltete Komponenten können sich selbst als Unterstützung für verwaltete "Interopassemblys" deklarieren, damit ein nicht verwalteter Win32-Komponenten-Consumer auf die deklarierende Assembly verweisen kann. Der Komponenten-Consumer kann mit der verwalteten Komponente interagieren, indem er CoCreateInstance auf einer GUID aufruft. Die Interoperationsebene leitet die Objekterstellungsanforderung an .NET Framework weiter, erstellt eine instance des verwalteten Objekts und gibt einen Schnittstellenzeiger zurück.

SxsLookupClrGuid ermöglicht es den Frameworks, Informationen abzurufen, die einer bestimmten GUID im Manifest der Komponente zugeordnet sind, z. B. der Name der .NET-Klasse, welche Version der .NET Framework benötigt wird und in welcher Hostassembly sie sich befindet. Verwaltete Komponenten veröffentlichen eine Interopassembly, die eine Reihe von Anweisungen enthält, die GUIDs mit Assembly- und Typnamen zuordnen, und die .NET-Runtime vermittelt die Konstruktion verwalteter Objektinstanzen, wenn CoCreateInstance aufgerufen wird.

Im Folgenden finden Sie ein Beispiel für ein Komponentenmanifest, das eine CLR-GUID und einen CLR-Ersatz deklariert, nach dem SxsLookupClrGuid suchen kann:

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

Ein Interoperationsanbieter ruft SxsLookupClrGuid mit einem Zeiger auf die GUID "{fdb46ca5-9477-4528-b4b2-7f00a254cdea}" auf. und erhält im Gegenzug den Klassennamen "MySampleSurrogate", die erforderliche Laufzeitversion "1.0.3055" und die Textidentität "DotNet.Sample.Surrogates,version='1.0.0.0',type='interop'" der Hostingkomponente.

Diese Rückgabeinformationen würden von einer wie folgt deklarierten SXS_GUID_INFORMATION_CLR-Struktur enthalten und/oder referenziert.

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;

Die Member dieser Struktur enthalten die folgenden Informationen.

Member BESCHREIBUNG
cbSize
Enthält die Größe der SXS_GUID_INFORMATION_CLR -Struktur (dadurch kann die Struktur in späteren Versionen wachsen).
dwFlags
Enthält einen der folgenden beiden Flagwerte:
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE (0x00000001): Gibt an, dass die angegebene GUID einem "Ersatzgat" zugeordnet war.
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS (0x00000002): Gibt an, dass die angegebene GUID einer "Klasse" zugeordnet war.
pcwszRuntimeVersion
Zeigt auf eine mit Null beendete Breitzeichenzeichenfolge, die die Version der Laufzeit identifiziert, die im Hostmanifest für diese Klasse angegeben ist.
pcwszTypeName
Zeigt auf eine mit Null beendete Breitzeichenzeichenfolge, die den Namen der .NET-Klasse enthält, die der angegebenen GUID zugeordnet ist.
pcwszAssemblyIdentity
Zeigt auf eine mit Null beendete Breitzeichenzeichenfolge, die die Textidentität der Assembly enthält, die diese Klasse hostet. Weitere Informationen zur Textidentität finden Sie unter "Angeben vollqualifizierter Typnamen" unter "Ermitteln von Typinformationen zur Laufzeit" unter "Programmieren mit dem .NET Framework" im .NET Framework SDK.

 

Eine nicht verwaltete Anwendung kann die auf diese Weise zurückgegebenen Informationen verwenden, um die richtige Version des .NET Framework zu laden, die assembly zu laden, die durch das pcwszAssemblyIdentity-Element identifiziert wurde, und dann eine instance der Klasse mit dem Namen des pcwszTypeName-Elements zu erstellen.

Beispiele

Verwenden Sie die dynamische Verknüpfung wie folgt, um die SxsLookupClrGuid-Funktion aufzurufen:

#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 );
  }
}

Anforderungen

Anforderung Wert
DLL
Mscoree.dll;
Sxs.dll

Siehe auch

Isolierte Anwendungen und parallele Assemblys

CreateActCtx

ActivateActCtx

Cocreateinstance