Moin moin,
ich habe vor einiger Zeit hier im Forum diesen
Thread gefunden.
Habe mir anhand der Informationen eine funktion gebastelt, die mir ein Jpeg aus einer Resource lädt.
Delphi-Quellcode:
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;
Sie funktioniert, nur habe ich dabei ein Verständnis Problem:
Ich lade das Image aus der Resource mit
LoadResource welche mir ein
Handle
auf einen Speicherbereich liefert (HGLOBAL).
Die Funktion
CreateStreamOnHGlobal erwartet als ersten Parameter ebenfalls
ein
Handle auf einen Speicherbereich vom Type HGlobal.
Warum muss ich den Zwischenschritt mit
GlobalAlloc und Move machen damit ich
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*