Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento příklad ukazuje použití funkce GetProcessHeaps k načtení popisovačů výchozí haldy procesu a všech soukromých hald, které jsou aktivní pro aktuální proces.
Příklad volá GetProcessHeaps dvakrát, nejprve aby vypočítal velikost vyrovnávací paměti potřebné k načtení a znovu k načtení popisovačů do vyrovnávací paměti. Vyrovnávací paměť je přidělena z výchozí haldy procesu pomocí popisovače vráceného GetProcessHeap. Příklad vypíše počáteční adresu každé haldy do konzole. Potom použije funkci HeapFree k uvolnění paměti přidělené pro vyrovnávací paměť.
Počet hald v procesu se může lišit. Proces má vždy alespoň jednu haldu ( výchozí haldu procesu) a může mít jednu nebo více privátních hald vytvořených aplikací nebo knihoven DLL, které jsou načteny do adresního prostoru procesu.
Upozorňujeme, že aplikace by měla využívat funkce haldy pouze na své výchozí hromadě procesu nebo na soukromých hromadách, které sama vytvořila; využívání funkce haldy na soukromé hromadě patřící jiné komponentě může způsobit nevyzpytatelné chování.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <intsafe.h>
int __cdecl _tmain()
{
DWORD NumberOfHeaps;
DWORD HeapsIndex;
DWORD HeapsLength;
HANDLE hDefaultProcessHeap;
HRESULT Result;
PHANDLE aHeaps;
SIZE_T BytesToAllocate;
//
// Retrieve the number of active heaps for the current process
// so we can calculate the buffer size needed for the heap handles.
//
NumberOfHeaps = GetProcessHeaps(0, NULL);
if (NumberOfHeaps == 0) {
_tprintf(TEXT("Failed to retrieve the number of heaps with LastError %d.\n"),
GetLastError());
return 1;
}
//
// Calculate the buffer size.
//
Result = SIZETMult(NumberOfHeaps, sizeof(*aHeaps), &BytesToAllocate);
if (Result != S_OK) {
_tprintf(TEXT("SIZETMult failed with HR %d.\n"), Result);
return 1;
}
//
// Get a handle to the default process heap.
//
hDefaultProcessHeap = GetProcessHeap();
if (hDefaultProcessHeap == NULL) {
_tprintf(TEXT("Failed to retrieve the default process heap with LastError %d.\n"),
GetLastError());
return 1;
}
//
// Allocate the buffer from the default process heap.
//
aHeaps = (PHANDLE)HeapAlloc(hDefaultProcessHeap, 0, BytesToAllocate);
if (aHeaps == NULL) {
_tprintf(TEXT("HeapAlloc failed to allocate %d bytes.\n"),
BytesToAllocate);
return 1;
}
//
// Save the original number of heaps because we are going to compare it
// to the return value of the next GetProcessHeaps call.
//
HeapsLength = NumberOfHeaps;
//
// Retrieve handles to the process heaps and print them to stdout.
// Note that heap functions should be called only on the default heap of the process
// or on private heaps that your component creates by calling HeapCreate.
//
NumberOfHeaps = GetProcessHeaps(HeapsLength, aHeaps);
if (NumberOfHeaps == 0) {
_tprintf(TEXT("Failed to retrieve heaps with LastError %d.\n"),
GetLastError());
return 1;
}
else if (NumberOfHeaps > HeapsLength) {
//
// Compare the latest number of heaps with the original number of heaps.
// If the latest number is larger than the original number, another
// component has created a new heap and the buffer is too small.
//
_tprintf(TEXT("Another component created a heap between calls. ") \
TEXT("Please try again.\n"));
return 1;
}
_tprintf(TEXT("Process has %d heaps.\n"), HeapsLength);
for (HeapsIndex = 0; HeapsIndex < HeapsLength; ++HeapsIndex) {
_tprintf(TEXT("Heap %d at address: %#p.\n"),
HeapsIndex,
aHeaps[HeapsIndex]);
}
//
// Release memory allocated from default process heap.
//
if (HeapFree(hDefaultProcessHeap, 0, aHeaps) == FALSE) {
_tprintf(TEXT("Failed to free allocation from default process heap.\n"));
}
return 0;
}