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
指向以 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 [仅限桌面应用] |
标头 | winnt.h (包括 Windows.h) |