Share via


struttura ASSEMBLY_FILE_DETAILED_INFORMATION (winnt.h)

La struttura ASSEMBLY_FILE_DETAILED_INFORMATION viene usata dalla funzione QueryActCtxW .

Sintassi

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

Members

ulFlags

Il valore è sempre 0 .

ulFilenameLength

Lunghezza in byte del nome file a cui punta lpFileName. Il conteggio non include il carattere null di terminazione.

ulPathLength

Lunghezza in byte della stringa di percorso a cui punta lpFilePath Il conteggio non include il carattere null di terminazione.

lpFileName

Stringa con terminazione Null che specifica il nome del file.

lpFilePath

Stringa con terminazione Null che specifica il percorso del file denominato in lpFileName.

Commenti

Se QueryActCtxW viene chiamato con l'opzione FileInformationInAssemblyOfAssemblyInActivationContext e la funzione ha esito positivo, le informazioni nel buffer restituito sono sotto forma di struttura ASSEMBLY_FILE_DETAILED_INFORMATION . Di seguito è riportato un esempio di struttura usata per contenere informazioni dettagliate sul contesto di attivazione e una chiamata da 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;
    }

Requisiti

Requisito Valore
Client minimo supportato Windows XP [solo app desktop]
Server minimo supportato Windows Server 2003 [solo app desktop]
Intestazione winnt.h (include Windows.h)