![]() |
Speicherreservierung / Verständnisfrage
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* |
Re: Speicherreservierung / Verständnisfrage
Wie alt ist das Buch? Im aktuellen PSDK stzeht nichts davon, dass diese Funktion veraltet wäre. Da steht nur:
Zitat:
|
Re: Speicherreservierung / Verständnisfrage
Zitat:
Zitat:
|
Re: Speicherreservierung / Verständnisfrage
Code kopiert und nicht verstanden? :zwinker: ... das rot markiert müßtest du komplett weglassen können. Das diente im Ursprungscode ja nur dem Kopieren der Daten aus der Datei in einen allozierten Speicherbereich. Da du aber bereits ein Handle hast, kannst du dir das sparen.
Code:
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 [color=red] 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);[/color] 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; |
Re: Speicherreservierung / Verständnisfrage
Moin moin,
Zitat:
Zitat:
Jetzt aber mal im ernst, genau das habe ich mir auch so gedacht und mich gewundert warum es denn nicht funktioniert. Und dafür wollte ich eine Erklärung haben, da ich genau Das nicht verstehe. Sorry, falls ich mich missverständlich ausgedrückt habe :oops: @Luckie: Ich habe die 1. Auflage von diesem Buch und werde in Zukunft das PSDK befragen... [Edit] Hatte Luckie falsch geschrieben [/Edit] |
Re: Speicherreservierung / Verständnisfrage
Zitat:
|
Re: Speicherreservierung / Verständnisfrage
Zitat:
Zitat:
|
Re: Speicherreservierung / Verständnisfrage
So, vergiß das Gesagte. Wäre ich nicht zu faul :oops: gewesen mal ins PSDK zu schauen, hätte ich die Lösung sofort gesehen. Das Handle welches
![]() ![]() Damit wäre das Rätsel gelöst. Die Daten müssen also mindestens einmal kopiert werden. Nachtrag: :wall: ... und wenn ich jetzt noch bei allen beiteiligten Funktionen nachgeguckt hätte, wäre mir folgendes aufgefallen Dokumentation von LockResource() im PSDK 2003: hResData [in] Handle to the resource to be locked. The LoadResource function returns this handle. Note that this parameter is listed as an HGLOBAL variable only for backwards compatibility. Do not pass any value as a parameter other than a successful return value from the LoadResource function. |
Re: Speicherreservierung / Verständnisfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Moin moin,
Zitat:
Ich hatte eher daran gedacht, LoadResource zu verwenden, da hier ein HGLOBAL zurückgegeben wird. Das es allerdings auch nicht wirklich ein Handle auf einen Globalen Speicherblock zurückliefert, habe ich auch erst eben nach deinem Post gelesen :oops: Nur was ist denn der eigentliche Unterschied? Wenn ich eine Resource in den Speicher lade, befindet sich diese doch auch "nur im Speicher"?! :gruebel: Und warum kann ich nicht mit den Virtual** funktionen auf diesen Speicher zugreifen? Diese funktionen sind doch auch nur für "Speicher-" zugriffe etc. da?! Es wäre schön, wenn Ihr mir ein paar Links empfehlen könntet, wo ich derartiges (Unterschiede Virtueller-/Globaler-/loakaler-/Heap- Speicher) mal nachlesen kann... So, ich habe jetzt dochmal ein Testprojekt zusammengestellt, falls es doch noch jemanden interessiert, bzw. jemand Sourcen zum testen des oben angesprochenen braucht... [OT] Die verwendetet Buttonklasse ist noch nicht fertig und meine Erste ohne die VCL... Also wenn Ihr hier eurer Meinung nach Sinnloses Zeug drin findet (findet Ihr bestimmt), dann lasst es mich doch bitte wissen... (Was nicht heisst, dass ich hier bewusst "Sinnloses Zeugs" geschrieben habe) (Ich möchte keine Codebeispiele haben, sondern dann nur sachlich begründete Aussagen) [/OT] |
Re: Speicherreservierung / Verständnisfrage
HGLOBAL steht übrigens nur in älteren Doks. - in den neuen ist's HRSRC!
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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