Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Работа с ресурсами без TResourceSteram

01.01.2007

FindResource + LoadResource + LockResource

 

Определяем размеры картинки хранящейся в ресурсах:

function PictureSize: TSize;
var
 
ResHandle: HWND;
 
ResData: HWND;
  BMI
: PBitmapInfo;
begin
 
Result.cx := 0;
 
Result.cy := 0;
 
ResHandle := FindResource(HInstance,
    MAKEINTRESOURCE
(200), RT_BITMAP);
 
if ResHandle <> 0 then
 
begin
   
ResData := LoadResource(HInstance, ResHandle);
   
if ResData <> 0 then
   
try
      BMI
:= LockResource(ResData);
     
if Assigned(BMI) then
     
try
       
Result.cx := BMI.bmiHeader.biWidth;
       
Result.cy := BMI.bmiHeader.biHeight;
     
finally
       
UnlockResource(ResData);
     
end;
   
finally
     
FreeResource(ResData);
   
end;
 
end;
end;

 
 

Получаем список всех ресурсов

function GetResourceList: Boolean;
var
 
Errors: Cardinal;
 
 
function CallBack(hModule: HMODULE; lpType: PChar;
    lpzName
: LPTSTR; lParam: Longint): BOOL; stdcall;
 
var
   
Size: Cardinal;
 
begin
   
Result := True;
   
if Assigned(lpzName) then
   
begin
     
Size := Length(ResourceName);
     
Inc(Size);
     
SetLength(ResourceName, Size);
     
ResourceName[Size - 1] := ShortString(lpzName);
     
if  (ResourceName[Size - 1] <> 'RES_INI') and
         
(ResourceName[Size - 1] <> 'RES_MDB') then
       
Inc(Errors);
   
end;
 
end;
 
begin
 
Result := True;
 
ResourceName := nil;
 
Errors := 0;
 
EnumResourceNames(HInstance, 'INSTALL', @CallBack, 0);
 
if (Length(ResourceName) <> 2) or (Errors > 0) then
 
begin
   
MessageBox(Handle, PChar(ERR_CORRUPT), PChar(ERR_GLOBAL),
      MB_OK
+ MB_ICONERROR);
   
Result := False;
   
PostQuitMessage(0);
 
end;
end;

 

Извлекаем ресурс в файл

function ExtractResource: Boolean;
const
 
ResName = 'RES_MDB';
 
 
function FileWrite(Handle: Integer; const Buffer; Count: LongWord): Integer;
 
const
   
BlockSize = 1024;
 
  type
   
TArray = array of Byte;
 
 
var
   
Buff: array [0..BlockSize - 1] of Byte;
   
Counter,
   
CurCount, A, I: LongWord;
 
begin
   
Counter := 0;
   
Result := Count;
    I
:= 10;
    repeat
     
if Count - Counter > BlockSize then
       
CurCount := BlockSize
     
else
       
CurCount := Count - Counter;
 
     
Move(TArray(@Buffer)[Counter], Buff[0], CurCount);
     
if WriteFile(THandle(Handle), Buff, CurCount, LongWord(Result), nil) then
       
Inc(Counter, CurCount)
     
else
     
begin
       
Result := -1;
       
Exit;
     
end;
 
      A
:= Round((Counter / Count) * 100);
     
if A > I then
     
begin
        I
:= A;
       
SendMessage(Progress, PBM_SETPOS, A, 0);
     
end;
 
   
until Counter = Count;
 
end;
 
var
 
ResHandle: HWND;
 
ResData: HWND;
 
LockRes: Pointer;
  fHandle
: Integer;
 
Size: Integer;
begin
 
Result := False;
 
try
   
ResHandle := FindResource(HInstance,
     
PChar(ResName), 'INSTALL');
   
if ResHandle = 0 then Exit;
   
ResData := LoadResource(HInstance, ResHandle);
   
if ResData = 0 then Exit;
   
try
     
LockRes := LockResource(ResData);
     
if not Assigned(LockRes) then Exit;
     
try
        fHandle
:= FileCreate(BasePath + '\MainDB.~mdb');
       
if fHandle = -1 then Exit;
       
try
         
Size := SizeofResource(HInstance, ResHandle);
 
         
if FileWrite(fHandle, LockRes^, Size) = -1 then Exit;
 
         
Result := True;
         
StatusDone := True;
       
finally
         
CloseHandle(THandle(fHandle));
       
end;
     
finally
       
UnlockResource(ResData);
     
end;
   
finally
     
FreeResource(ResData);
   
end;
 
finally
   
PostMessage(Handle, WM_NOTIFY_THREAD_RESULT, Integer(Result), 0);
 
end;
end;

 

Отрисовываем картинку из ресурса на форме:

procedure ShowPicture;
 
 
function Rect(Left, Top, Right, Bottom: Integer): TRect;
 
begin
   
Result.Left := Left;
   
Result.Top := Top;
   
Result.Right := Right;
   
Result.Bottom := Bottom;
 
end;
 
var
 
Bitmap: HBITMAP;
 
BitmapSize: TSize;
  DC
, BitmapDC, OldDC: HDC;
  bLeft
, bTop: Cardinal;
  _Rect
: TRect;
  S
: String;
 
Pen: HPEN;
begin
 
Bitmap := LoadBitmap(HInstance, MAKEINTRESOURCE(200));
 
if Bitmap <> 0 then
 
try
   
BitmapSize := PictureSize;
    DC
:= GetDC(Handle);
   
try
     
BitmapDC := CreateCompatibleDC(DC);
     
try
       
OldDC := SelectObject(BitmapDC, Bitmap);
       
try
          bLeft
:= (Width - BitmapSize.cx);
          bTop
:= 0;
         
StretchBlt(DC, 0, 0, bLeft, BitmapSize.cy, BitmapDC, 0, 0, 1, BitmapSize.cy, SRCCOPY);
         
BitBlt(DC, bLeft, bTop, BitmapSize.cx, BitmapSize.cy, BitmapDC, 0, 0, SRCCOPY);
 
         
SetBkMode(DC, OPAQUE);
         
if hFontBold <> 0 then
           
SelectObject(DC, hFontBold);
          S
:= INFO1;
          _Rect
:= Rect(10, 6, 230, 31);
         
DrawText(DC, PChar(S), Length(S), _Rect, DT_WORDBREAK);
 
         
if hFontNormal <> 0 then
           
SelectObject(DC, hFontNormal);
          S
:= INFO2;
          _Rect
:= Rect(10, 40, 280, 70);
         
DrawText(DC, PChar(S), Length(S), _Rect, DT_WORDBREAK + DT_NOCLIP);
          S
:= INFO3;
          _Rect
:= Rect(10, 55, 280, 100);
         
DrawText(DC, PChar(S), Length(S), _Rect, DT_WORDBREAK + DT_NOCLIP);
 
         
Pen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW));
         
try
           
SelectObject(DC, Pen);
           
MoveToEx(DC, 6, 127, nil);
           
LineTo(DC, 349, 127);
         
finally
           
DeleteObject(Pen);
         
end;
 
         
Pen := CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT));
         
try
           
SelectObject(DC, Pen);
           
MoveToEx(DC, 348, 128, nil);
           
LineTo(DC, 5, 128);
         
finally
           
DeleteObject(Pen);
         
end;
 
       
finally
       
SelectObject(OldDC, Bitmap);
       
end;
     
finally
       
DeleteDC(BitmapDC);
     
end;
   
finally
     
ReleaseDC(Handle, DC);
   
end;
 
finally
   
DeleteObject(Bitmap);
 
end;
end;

 

Взято из https://forum.sources.ru

Автор: Rouse_