![]() |
Verständnisproblem Speicherreservierung
Moin moin,
ich habe vor einiger Zeit hier im Forum diesen ![]() Habe mir anhand der Informationen eine funktion gebastelt, die mir ein Jpeg aus einer Resource lädt.
Delphi-Quellcode:
Sie funktioniert, nur habe ich dabei ein Verständnis Problem:
function LoadPictureFromRes(Instance: THandle; const szResName, szResType : String; var pPicture: IPicture) : Boolean;
const IID_IPicture : TGUID = '{7BF80980-BF32-101A-8BBB-00AA00300CAB}'; var hResInfo, hResGlobal : THandle; dwResSize : DWord; pResData : Pointer; // hMem : THandle; pData : Pointer; // hRslt : HResult; pStream : IStream; Begin Result := False; hResInfo := FindResource(Instance, Pointer(szResName), Pointer(szResType)); if hResInfo = 0 then Exit; hResGlobal := LoadResource(Instance, hResInfo); if hResGlobal = 0 then Exit; hMem := 0; try pResData := LockResource(hResGlobal); if Not Assigned(pResData) then Exit; dwResSize := SizeofResource(Instance, hResInfo); if dwResSize = 0 then Exit; hMem := GlobalAlloc(GHND or GMEM_NODISCARD, dwResSize); if hMem = 0 then Exit; pData := GlobalLock(hMem); if Not Assigned(pData) then Exit; Move(pResData^, pData^, dwResSize); GlobalUnlock(hMem); pStream := nil; hRslt := CreateStreamOnHGlobal(hMem, True, pStream); if FAILED(hRslt) or (pStream = nil) then Exit; hRslt := OleLoadPicture(pStream, dwResSize, False, IID_IPicture, pPicture); if (hRslt = S_OK) and (pPicture <> nil) then Result := True; finally pStream := nil; if hMem <> 0 then GlobalFree(hMem); if hResGlobal <> 0 then FreeResource(hResGlobal); end; end; Ich lade das Image aus der Resource mit ![]() auf einen Speicherbereich liefert (HGLOBAL). Die Funktion ![]() ein Handle auf einen Speicherbereich vom Type HGlobal. Warum muss ich den Zwischenschritt mit ![]() letztendlich an die Daten komme? Davon mal abgesehen, würde ich gerne auf GlobalAlloc verzichten. Mein Win32API Buch ( sagt mir, dass GlobalAlloc und Konsorten Relikte aus der Win16 Zeit sind und intern auf die Virtual-Funktionen abgebildet werden. Jeder Versuch die Virtual* -Funktionen hiermit (CreateStreamOnHGlobal) zu nutzen, schlug fehl. Was genau ist denn bei den Virtual* funktionen anders und warum funktioniert CreateStreamOnHGlobal nur mit GlobalAlloc? Wäre vieleicht mal jemand so lieb/nett und könnte mir das mal erklären? *liebgrins* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz