Поделиться через


структура 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

Длина удостоверения закодированной сборки в байтах.

ulManifestPathType

Это значение всегда является константой.

ulManifestPathLength

Длина пути к манифесту сборки в байтах.

liManifestLastWriteTime

Время последней записи манифеста. Это структура данных FILETIME .

ulPolicyPathType

Это значение всегда является константой.

ulPolicyPathLength

Длина пути политики издателя в байтах.

liPolicyLastWriteTime

Время последней записи политики. Это структура данных FILETIME .

ulMetadataSatelliteRosterIndex

Индекс вспомогательного списка метаданных.

ulManifestVersionMajor

Основная версия сборки, запрашиваемой QueryActCtxW. Дополнительные сведения см. в разделе Версии сборок.

ulManifestVersionMinor

Дополнительный номер версии сборки, запрашиваемой QueryActCtxW. Дополнительные сведения см. в разделе Версии сборок.

ulPolicyVersionMajor

Основная версия любой политики, если она существует.

ulPolicyVersionMinor

Дополнительная версия любой политики, если она существует.

ulAssemblyDirectoryNameLength

Длина имени каталога сборки в байтах.

lpAssemblyEncodedAssemblyIdentity

Указатель на строку, завершающуюся нулевым значением, которая содержит текстовый формат удостоверения сборки.

lpAssemblyManifestPath

Указатель на строку, завершающуюся null, которая указывает исходный путь к манифесту этой сборки.

lpAssemblyPolicyPath

Указатель на строку, завершающуюся значением NULL, которая указывает путь к любой сборке политики, используемой для определения того, что эта версия сборки должна быть загружена. Если этот элемент имеет значение NULL, политика не использовалась для загрузки этой версии.

lpAssemblyDirectoryName

Указатель на строку, завершающуюся значением NULL, которая указывает папку, из которой была загружена эта сборка.

ulFileCount

Комментарии

Если метод QueryActCtxW вызывается с параметром AssemblyDetailedInformationInActivationContext и функция завершается успешно, то сведения в возвращенном буфере будут в виде структуры 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 [только классические приложения]
Верхняя часть winnt.h (включая Windows.h)