다음을 통해 공유


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

설명

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 포함)