Einzelnen Beitrag anzeigen

Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#1

Speicherreservierung / Verständnisfrage

  Alt 21. Aug 2005, 23:43
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 MSDN-Library durchsuchenLoadResource welche mir ein Handle
auf einen Speicherbereich liefert (HGLOBAL).
Die Funktion MSDN-Library durchsuchenCreateStreamOnHGlobal erwartet als ersten Parameter ebenfalls
ein Handle auf einen Speicherbereich vom Type HGlobal.
Warum muss ich den Zwischenschritt mit MSDN-Library durchsuchenGlobalAlloc und Move machen damit ich
letztendlich an die Daten komme?

Davon mal abgesehen, würde ich gerne auf GlobalAlloc verzichten. Mein Win32API Buch (http://www.amazon.de/exec/obidos/ASIN/3932311051/delphipraxis-21)
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*
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat