Einzelnen Beitrag anzeigen

Olli
(Gast)

n/a Beiträge
 
#4

Re: Speicherreservierung / Verständnisfrage

  Alt 22. Aug 2005, 00:45
Code kopiert und nicht verstanden? ... 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;
  Mit Zitat antworten Zitat