Share via


ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION 構造体 (winnt.h)

ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION構造体は、QueryActCtxW 関数によって使用されます。

構文

typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
  DWORD         ulFlags;
  DWORD         ulEncodedAssemblyIdentityLength;
  DWORD         ulManifestPathType;
  DWORD         ulManifestPathLength;
  LARGE_INTEGER liManifestLastWriteTime;
  DWORD         ulPolicyPathType;
  DWORD         ulPolicyPathLength;
  LARGE_INTEGER liPolicyLastWriteTime;
  DWORD         ulMetadataSatelliteRosterIndex;
  DWORD         ulManifestVersionMajor;
  DWORD         ulManifestVersionMinor;
  DWORD         ulPolicyVersionMajor;
  DWORD         ulPolicyVersionMinor;
  DWORD         ulAssemblyDirectoryNameLength;
  PCWSTR        lpAssemblyEncodedAssemblyIdentity;
  PCWSTR        lpAssemblyManifestPath;
  PCWSTR        lpAssemblyPolicyPath;
  PCWSTR        lpAssemblyDirectoryName;
  DWORD         ulFileCount;
} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;

メンバー

ulFlags

この値は常に 0 です。

ulEncodedAssemblyIdentityLength

エンコードされたアセンブリ ID の長さ (バイト単位)。

ulManifestPathType

この値は常に定数です。

ulManifestPathLength

アセンブリ マニフェスト パスの長さ (バイト単位)。

liManifestLastWriteTime

マニフェストが最後に書き込まれた時刻。 これは FILETIME データ構造の形式です。

ulPolicyPathType

この値は常に定数です。

ulPolicyPathLength

パブリッシャー ポリシー パスの長さ (バイト単位)。

liPolicyLastWriteTime

ポリシーが最後に作成された時刻。 これは FILETIME データ構造の形式です。

ulMetadataSatelliteRosterIndex

メタデータ サテライト名簿インデックス。

ulManifestVersionMajor

QueryActCtxW によって照会されるアセンブリのメジャー バージョン。 詳細については、「 アセンブリ のバージョン」を参照してください。

ulManifestVersionMinor

QueryActCtxW によって照会されるアセンブリのマイナー バージョン。 詳細については、「 アセンブリ のバージョン」を参照してください。

ulPolicyVersionMajor

ポリシーのメジャー バージョン (存在する場合)。

ulPolicyVersionMinor

ポリシーのマイナー バージョン (存在する場合)。

ulAssemblyDirectoryNameLength

アセンブリ ディレクトリ名の長さ (バイト単位)。

lpAssemblyEncodedAssemblyIdentity

アセンブリの ID のテキスト形式でエンコードされた形式を含む null で終わる文字列へのポインター。

lpAssemblyManifestPath

このアセンブリのマニフェストへの元のパスを示す null で終わる文字列へのポインター。

lpAssemblyPolicyPath

このバージョンのアセンブリを読み込む必要があるかどうかを判断するために使用されたポリシー アセンブリのパスを示す null で終わる文字列へのポインター。 このメンバーが null の場合、このバージョンの読み込みを決定するためのポリシーは使用されませんでした。

lpAssemblyDirectoryName

このアセンブリの読み込み元フォルダーを示す null で終わる文字列へのポインター。

ulFileCount

注釈

AssemblyDetailedInformationInActivationContext オプションを使用して QueryActCtxW が呼び出され、関数が成功した場合、返されるバッファー内の情報は ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION 構造体の形式になります。

PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION pAssemblyInfo = NULL;
ACTIVATION_CONTEXT_QUERY_INDEX QueryIndex;
BOOL fSuccess = FALSE;
SIZE_T cbRequired;
HANDLE hActCtx = INVALID_HANDLE_VALUE;
BYTE bTemporaryBuffer[512];
PVOID pvDataBuffer = (PVOID)bTemporaryBuffer;
SIZE_T cbAvailable = sizeof(bTemporaryBuffer);

// Request the first file in the root assembly
QueryIndex.ulAssemblyIndex = 1;
QueryIndex.ulFileIndexInAssembly = 0;

if (GetCurrentActCtx(&hActCtx)) {

    // Attempt to use our stack-based buffer first - if that's not large
    // enough, allocate from the heap and try again.
    fSuccess = QueryActCtxW(
        0, 
        hActCtx, 
        (PVOID)&QueryIndex, 
        AssemblyDetailedInformationInActivationContext,
        pvDataBuffer,
        cbAvailable,
        &cbRequired);

    // Failed, because the buffer was too small.
    if (!fSuccess && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {

        // Allocate what we need from the heap - fail if there isn't enough
        // memory to do so.        
        pvDataBuffer = HeapAlloc(GetProcessHeap(), 0, cbRequired);
        if (pvDataBuffer == NULL) {
            fSuccess = FALSE;
            goto DoneQuerying;
        }
        cbAvailable = cbRequired;

        // If this fails again, exit out.
        fSuccess = QueryActCtxW(
            0, 
            hActCtx,
            (PVOID)&QueryIndex,
            AssemblyDetailedInformationInActivationContext,
            pvDataBuffer,
            cbAvailable,
            &cbRequired);

    }

    if (fSuccess) {
        // Now that we've found the assembly info, cast our target buffer back to
        // the assembly info pointer.  Use pAssemblyInfo->lpFileName
        pAssemblyInfo = (PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION)pvDataBuffer;
    }
}

DoneQuerying:
    if (hActCtx != INVALID_HANDLE_VALUE)
        ReleaseActCtx(hActCtx);

    if (pvDataBuffer && (pvDataBuffer != bTemporaryBuffer)) {
        HeapFree(GetProcessHeap(), 0, pvDataBuffer);
        pvDataBuffer = 0;
    }

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
Header winnt.h (Windows.h を含む)