Извините, мой последний ответ был опубликован наполовину, я нажал клавишу Tab и вошел, не помня, что это текстовое поле, а не редактор ...
В любом случае, вот это полностью:
Вы можете использовать библиотеку обходов, чтобы подключить функции выделения и освобождения, заменив их своими:
Смутно как-то так:
//declare a global
HANDLE g_currentHeap;
LPVOID WINAPI HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes)
{
return OriginalHeapAlloc(g_currentHeap, dwFlags, dwBytes);
}
BOOL WINAPI HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)
{
return OriginalHeapFree(g_currentHeap, dwFlags, lpMem);
}
в приложении load
HANDLE g_Heaps[2];
int main()
{
// Two heaps
g_Heaps[0] = HeapCreate(...);
g_Heaps[1] = HeapCreate(...);
// Do whatevers needed to hook HeapAlloc and HeapFree and any other heap functions
// and redirect them to the versions above
// Save the old function pointers so we can call them
}
Тогда каждый раз, когда вы вызываете API из сторонней DLL, вы можете сделать это
void someFn()
{
g_currentHeap = g_Heaps[1];
Some3rdPartyAPI();
g_currentHeap = g_Heaps[0];
SomeOtherFunction();
}
Это должно решить вашу проблему
@ peterchen: среда выполнения C ++ вызывает HeapAlloc для new и malloc (), поэтому этот подход будет работать. На самом деле, я считаю, что практически во всех языках исполнения будут использоваться функции кучи win32, если только для этого не было особой причины.