Speicherleck, aber wo ?
-
Hallo mal wieder,
Habe einen kleine Image-Viewer geschrieben, es werden .jpg - Bilder aus einer Resource geladen und dargestellt. Leider bleibt die geladene Resource aber im Speicher zurück,... Das Leck steckt irgendwo in dieser Funktion, wäre toll, wenn hier jemand einen Tipp für mich hätte, ich bin am verzweifeln:
HMODULE hMDll=LoadLibrary("6thEdi.dll"); if (!hMDll) { return FALSE; } HRSRC hRes = FindResource(hMDll,ReturnName, RT_RCDATA); if(!hRes) { return FALSE; } DWORD ResSize=SizeofResource(hMDll, hRes); HGLOBAL MemHandle = LoadResource(hMDll, hRes); if(MemHandle == NULL) { return FALSE; } BYTE *MemPtr = (BYTE*)LockResource(MemHandle); LPSTREAM zstream = NULL; HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, &zstream); zstream->Write((LPVOID)MemPtr, ResSize,0); LARGE_INTEGER li; li.QuadPart = 0; zstream->Seek(li, STREAM_SEEK_SET, NULL); if (gpPicture) gpPicture->Release(); hr = ::OleLoadPicture(zstream, ResSize, FALSE, IID_IPicture, (LPVOID *)&gpPicture); zstream->Release(); FreeLibrary(hMDll); }
Ach ja, gpPicture ist oben als globale Variable deklariert, schlechter Stil, ich weiss...
Danke für jede Antwort,
BM
-
Zu dem Paar LoadResource und LockResource(MemHandle) muß am Ende GlobalUnlock(MemHandle) und FreeResource(MemHandle) aufgerufen werden. Wenn ich Dir einen Tipp geben darf:
Ich mach mir am Ende einer solchen Funktion immer ein Spunglabel hin, bei dem ich alle Aufräumarbeiten durchführe und bei jedem Fehler springen kann. Dadurch wird das Ganze viel übersichtlicher; also in Deinem BeispielExit: if (MemHandle) { GlobalUnlock (MemHandle); FreeResource (MemHandle); } if (hMDll) FreeLibrary (hMDll);
MemHandle mußt Du dann am Anfang natürlich auf 0 setzen.