次の方法で共有


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

パラメーター

dwFlags [in]

次のフラグの 0 個以上の組み合わせ。

説明
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 パラメーターが指すバッファーのサイズ (バイト単位)。

pcbOutputBuffer [out]

戻り値情報のサイズ (バイト単位) が終了時に配置される変数へのポインター。 cbOutputBuffer パラメーターが 0 の場合、または出力バッファーのサイズが戻り値のサイズより小さい場合、SxsLookupClrGuid は失敗し、GetLastError はERROR_INSUFFICIENT_BUFFERのエラーを返します。 この場合、 pcbOutputBuffer が指す変数の値を使用して十分な大きさのバッファーを割り当て、 SxsLookupClrGuid をもう一度呼び出して目的の情報を取得します。

戻り値

成功した場合は TRUE 、それ以外の場合 は FALSE を 返します。 エラーの詳細については、GetLastError を呼び出します。

解説

この関数には、インポート ライブラリまたはヘッダー ファイルが関連付けされません。 LoadLibrary 関数と GetProcAddress 関数を使用して呼び出す必要があります。

マネージド コンポーネントは、アンマネージド Win32 コンポーネント コンシューマーが宣言アセンブリを参照できるように、マネージド "相互運用アセンブリ" をサポートしていると宣言できます。 コンポーネント コンシューマーは、GUID で CoCreateInstance を呼び出すことによって、マネージド コンポーネントと対話できます。 相互運用レイヤーは、オブジェクト作成要求を.NET Frameworkにルーティングし、マネージド オブジェクトのインスタンスを作成して、インターフェイス ポインターを返します。

SxsLookupClrGuid を使用すると、フレームワークは、コンポーネントのマニフェスト内の特定の GUID に関連付けられている情報 (.NET クラス名とは何か、必要な.NET Frameworkのバージョン、配置されているホスト アセンブリなど) を取得できます。 マネージド コンポーネントは、GUID をアセンブリ名と型名に関連付ける多数のステートメントを含む相互運用機能アセンブリを発行します。.NET ランタイムは、 CoCreateInstance が呼び出されたときにマネージド オブジェクト インスタンスの構築を仲介します。

SxsLookupClrGuid が検索できる CLR GUID と CLR サロゲートを宣言するサンプル コンポーネント マニフェストを次に示します。

<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"、およびテキスト ID "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
次の 2 つのフラグ値のいずれかが含まれます。
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_SURROGATE (0x00000001): 指定した GUID が "サロゲート" に関連付けられたことを示します。
  • SXS_GUID_INFORMATION_CLR_FLAG_IS_CLASS (0x00000002): 指定した GUID が "クラス" に関連付けられていることを示します。
pcwszRuntimeVersion
このクラスのホスト マニフェストで指定されたランタイムのバージョンを識別する、0 で終わるワイド文字列を指します。
pcwszTypeName
指定した GUID に関連付けられている .NET クラスの名前を含む、0 で終わるワイド文字列を指します。
pcwszAssemblyIdentity
このクラスをホストするアセンブリのテキスト ID を含む、0 で終わるワイド文字列を指します。 テキスト ID の詳細については、.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]
Mscoree.dll;
Sxs.dll

関連項目

分離アプリケーションと side-by-side アセンブリ

CreateActCtx

ActivateActCtx

Cocreateinstance