ASSEMBLY_FILE_DETAILED_INFORMATION 構造体 (winnt.h)

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

構文

typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
  DWORD  ulFlags;
  DWORD  ulFilenameLength;
  DWORD  ulPathLength;
  PCWSTR lpFileName;
  PCWSTR lpFilePath;
} ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;

メンバー

ulFlags

この値は常に 0 です。

ulFilenameLength

lpFileName が指すファイル名の長さ (バイト単位)。 カウントには、終端の null 文字は含まれません。

ulPathLength

lpFilePath が指すパス文字列の長さ (バイト単位) カウントには、終端の null 文字は含まれません。

lpFileName

ファイルの名前を指定する Null で終わる文字列。

lpFilePath

lpFileName 内の という名前のファイルへのパスを指定する Null で終わる文字列。

注釈

FileInformationInAssemblyOfAssemblyInActivationContext オプションを使用して QueryActCtxW が呼び出され、関数が成功した場合、返されるバッファー内の情報は ASSEMBLY_FILE_DETAILED_INFORMATION 構造体の形式になります。 アクティブ化コンテキストと QueryActCtxW からの呼び出しに関する詳細情報を保持するために使用される構造体の例を次に示します。

PASSEMBLY_FILE_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, 
        FileInformationInAssemblyOfAssemblyInActivationContext,
        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,
            FileInformationInAssemblyOfAssemblyInActivationContext,
            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 = (PASSEMBLY_FILE_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 を含む)