структура ACTIVATION_CONTEXT_DETAILED_INFORMATION (winnt.h)
Структура ACTIVATION_CONTEXT_DETAILED_INFORMATION используется функцией QueryActCtxW .
Синтаксис
typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
DWORD dwFlags;
DWORD ulFormatVersion;
DWORD ulAssemblyCount;
DWORD ulRootManifestPathType;
DWORD ulRootManifestPathChars;
DWORD ulRootConfigurationPathType;
DWORD ulRootConfigurationPathChars;
DWORD ulAppDirPathType;
DWORD ulAppDirPathChars;
PCWSTR lpRootManifestPath;
PCWSTR lpRootConfigurationPath;
PCWSTR lpAppDirPath;
} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
Члены
dwFlags
Это значение всегда равно 0.
ulFormatVersion
Это значение задает формат возвращаемых сведений. В Windows XP и Windows Server 2003 этот элемент всегда равен 1.
ulAssemblyCount
Количество сборок в контексте активации.
ulRootManifestPathType
Указывает тип пути, из которого был загружен манифест этой сборки.
Этот элемент всегда является одной из следующих констант:
ulRootManifestPathChars
Число символов в пути к манифесту.
ulRootConfigurationPathType
Указывает тип пути, из которого был загружен манифест конфигурации приложения этой сборки.
Этот элемент всегда является одной из следующих констант:
ulRootConfigurationPathChars
Число символов в пути к файлу конфигурации приложения.
ulAppDirPathType
Указывает тип пути, из которого был загружен манифест приложения.
Этот элемент всегда является одной из следующих констант:
ulAppDirPathChars
Число символов в каталоге приложения.
lpRootManifestPath
Путь к манифесту приложения.
lpRootConfigurationPath
Путь к файлу конфигурации.
lpAppDirPath
Путь к каталогу приложения.
Комментарии
Если queryActCtxW вызывается с параметром ActivationContextDetailedInformation и функция завершается успешно, то сведения в возвращенном буфере будут в виде структуры ACTIVATION_CONTEXT_DETAILED_INFORMATION . Ниже приведен пример структуры, используемой для хранения подробных сведений о контексте активации и вызове из QueryActCtxW.
PACTIVATION_CONTEXT_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_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) |