共用方式為


SxsLookupClrGuid 函式

擷取與元件資訊清單中指定 GUID 相關聯的類別名稱和其他資訊。 只有在實作.NET Framework中的低階 Managed-Unmanaged 互通性時,才會使用此函式。 For more information about managed-unmanaged interoperability, see "Interoperating with Unmanaged Code" in the .NET Framework SDK and also Isolated Applications and Side-by-side Assemblies.

語法

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 會搜尋 Surrogate。
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 會先搜尋 Surrogate,而且只有在找不到代理時,才會搜尋類別。

 

pClsid [in]

要搜尋啟用內容以取得交互操作資訊之 GUID 的指標。 此參數不可為 Null

hActCtx [in, 選擇性]

如果在dwFlags參數中設定SXS_LOOKUP_CLR_GUID_USE_ACTCTX旗標,則 hActCtx 必須包含 CreateActCtx函式所傳回的啟用內容控制碼。 否則會忽略 hActCtx

pvOutputBuffer [in, out, optional]

將傳回信息複製到其中之緩衝區的指標。 只有當 cbOutputBuffer 參數為零值時,這個參數才可為 Null 值。 如果有任何) 包含 SXS_GUID_INFORMATION_CLR 結構,後面接著任何其他字串資料,則在此緩衝區中放置的資料 (。 如需詳細資訊,請參閱下面的一節。

cbOutputBuffer [in]

以位元組為單位的緩衝區大小, 由 pvOutputBuffer 參數所指向。

spOutputBuffer [out]

變數的指標,其中傳回信息的大小以位元組為單位,置於結束時。 如果 cbOutputBuffer 參數為零,或輸出緩衝區的大小小於傳回信息的大小, 則 SxsLookupClrGuid 會失敗,而 GetLastError 會傳回 ERROR_INSUFFICIENT_BUFFER的錯誤。 在此情況下,請使用 由 sqlOutputBuffer 指向的變數中的值來配置夠大的緩衝區,然後再次呼叫 SxsLookupClrGuid 以擷取所需的資訊。

傳回值

如果成功,則傳回 TRUE ,否則傳回 FALSE 。 如需詳細資訊,請呼叫GetLastError

備註

此函式沒有相關聯的匯入程式庫或標頭檔;您必須使用 LoadLibraryGetProcAddress 函式來呼叫它。

Managed 元件可能會將自己宣告為支援的 Managed「Interop 元件」,以便允許 Unmanaged Win32 元件取用者參考宣告元件。 元件取用者可以在 GUID 上呼叫 CoCreateInstance 來與受控元件互動。 交互操作層會將物件建立要求路由傳送至.NET Framework、建立 Managed 物件的實例,並傳回介面指標。

SxsLookupClrGuid可讓架構擷取元件資訊清單中與指定 GUID 相關聯的資訊,例如其 .NET 類別名稱是什麼、其所需的.NET Framework版本,以及它所在的主機元件。 Managed 元件會發佈 Interop 元件,其中包含一些語句與元件和類型名稱建立關聯的語句,而 .NET 執行時間會在呼叫 CoCreateInstance 時代理建構 Managed 物件實例。

以下是宣告 CLR GUID 的範例元件資訊清單,以及 SxsLookupClrGuid 可以查閱的 CLR Surrogate:

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

這個結構的成員包含下列資訊。

member 描述
cbSize
包含SXS_GUID_INFORMATION_CLR結構的大小, (這可讓結構在更新版本中成長) 。
dwFlags
包含下列兩個旗標值的其中一個:
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE (0x00000001) :指出指定的 GUID 與 「surrogate」 相關聯。
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS (0x00000002) :表示指定的 GUID 與 「class」 相關聯。
pcwszRuntimeVersion
指向以零結束的寬字元字串,識別這個類別之主機資訊清單中指定的執行時間版本。
pcwszTypeName
指向以零結尾的寬字元字串,其中包含與指定 GUID 相關聯的 .NET 類別名稱。
pcwszAssemblyIdentity
指向以零結尾的寬字元字串,其中包含裝載此類別之元件的文字識別。 For more information about textual identity, see "Specifying Fully Qualified Type Names" under "Discovering Type Information at Run Time" under "Programming with the .NET Framework" in the .NET Framework SDK.

 

Unmanaged 應用程式可以使用以這種方式傳回的資訊來載入正確的.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