Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ресурсы в длл [D7, XP]


Tim ©   (2011-08-02 18:25:00) 

Всем привет, использую в программе dll, подключаю их динамически. Понадобилось хранить в картинки в ресурсах,  все бы хорошо  работает, но  хотелось бы узнать можно ли запихнуть эти ресурсы с картинками в файл длл, и вызывать картинки уже из ресурсов хранящихся в длл?


Tim   (2011-08-04 00:30:00) [1]

Да именно так и сделал с hInstance.
Спасибо за ответы, очень помогли!


Игорь Шевченко   (2011-08-03 10:38:00) [2]


> Еще такой вопрос, можно ли получить доступ к ресурсам длл
> внутри самой длл?


Безусловно можно, именно так, как написано, с hInstance самой DLL


Германн   (2011-08-03 01:50:00) [3]


> Еще такой вопрос, можно ли получить доступ к ресурсам длл
> внутри самой длл?

А почему бы и нет?
Или тебя беспокоит "хендл самой длл"?


Tim   (2011-08-03 01:30:00) [4]

Еще такой вопрос, можно ли получить доступ к ресурсам длл внутри самой длл?
Скажем по тому же принципу вогнать в длл ресурсы, а потом написав процедуру внутри длл обратится к реcурсу по имени и загнать его в bmp?
внутри длл:
    BM := TBitmap.Create;
    BM.LoadFromResourceName(хендл самой длл, 'BIRTHDAYSIGN');
    BM.Free;


Tim   (2011-08-03 01:21:00) [5]

Понял и разобрался, спасибо еще раз!


Игорь Шевченко   (2011-08-02 23:48:00) [6]


> вопрос решил путем замены что в файле rc что в проекте  
> BITMAP на RCDATA, но для меня все равно остается вопросом
> почему так


RCDATA сохраняет данные файла в ресурс не преобразовывая, а следовательно, оставляя TBitmapFileHeader.

BITMAP же обрезает ненужные заголовки, чтобы ресурс был компактнее. Это еще со времен Windows 3, если не раньше, где экономили каждый байт.


Игорь Шевченко   (2011-08-02 23:46:00) [7]

Tim   (02.08.11 23:27) [9]

dllres.rc

BIRTHDAYSIGN BITMAP "BirthdaySign.bmp"

в проекте dll

library ResDll;

uses
 SysUtils,
 Classes;

{$R *.res}
{$R dllres.RES}

begin
end.


dllres.RES из dllres.rc получается ручной компиляцией brcc32


Германн   (2011-08-02 23:36:00) [8]


> {$R 'im.res' 'im.rc'}

А зачем сразу и im.res и im.rc?


Tim   (2011-08-02 23:27:00) [9]

Игорь Шевченко, спасибо! Ваш пример у меня не сработал, быть может это связано с тем что я не правильно храню данные в длл?
у меня так:
library Project2;

uses
SysUtils,
Classes,
JPEG;

{$R 'im.res' 'im.rc'}

begin
end.


Игорь Шевченко   (2011-08-02 21:33:00) [10]


>  Bitmap image is not valid


Bitmap при чтении из Stream ожидает TBitmapFileHeader в начале данных, а в ресурсах его нет.

Это я опрометчиво посоветовал, Bitmap.LoadfromStream


Игорь Шевченко   (2011-08-02 21:29:00) [11]

Набросал на скорую руку пример:

procedure TForm1.Button1Click(Sender: TObject);
var
 BM: TBitmap;
 H: HMODULE;
begin
 H := LoadLibrary('ResDll.dll');
 if H <> 0 then
   try
     BM := TBitmap.Create;
     try
       BM.LoadFromResourceName(H, 'BIRTHDAYSIGN');
       Image1.Picture.Assign(BM);
     finally
       BM.Free;
     end;
   finally
     FreeLibrary(H);
   end;
end;


Работает.


Tim   (2011-08-02 21:09:00) [12]

вопрос решил путем замены что в файле rc что в проекте  BITMAP на RCDATA, но для меня все равно остается вопросом почему так.


Tim   (2011-08-02 20:50:00) [13]

поправил image1.Picture.Assign( Bmp); хотя до этой строчки и не доходит


Tim   (2011-08-02 20:49:00) [14]

Спасибо, тогда по-порядку, в папке лежит файл ASD.bmp, там же im.rс содержит BB BITMAP "ASD.bmp"
длл:

library Project2;

uses
 SysUtils,
 Classes,
 JPEG;

{$R 'im.res' 'im.rc'}

begin
end.

файл im.res тоже в папочке лежит.
в основной программе:
procedure TForm1.Button3Click(Sender: TObject);
var
 h: THandle;
 imageStream: TResourceStream;
 bmp:Tbitmap;
begin
 h:= LoadLibrary('Project2.Dll');
 imageStream:=TResourceStream.Create(h,'BB',RT_BITMAP);
 bmp := TBitmap.Create;
 bmp.LoadFromStream(imageStream);
 image1.Picture.Assign(Bitmap);
 bmp.Free;
 imageStream.Free;
 FreeLibrary(h);
end;


на строчке
bmp.LoadFromStream(imageStream); выдает ошибку Bitmap image is not valid

что делаю не так?


Игорь Шевченко   (2011-08-02 20:34:00) [15]

Хранить ресурсы в DLL безусловно можно.


> image1.Picture.Graphic.LoadFromStream(imageStream);


Bitmap.LoadFromSteam(...
image1.Picture.Assign(Bitmap);


Tim   (2011-08-02 18:32:00) [16]

вполне могу обойтись из без внедрения в длл ресурсов, но просто интересно как сделать в случае с длл))


Tim   (2011-08-02 18:28:00) [17]

из программы вытаскиваю ресурсы:
bmp := TBitmap.Create;
Bmp.LoadFromResourceName(HInstance, 'BB');
Image1.Picture.Assign(bmp);


в случае с длл, в проект длл добавил
{$R 'im.res' 'im.rc'}

а из программы вызываю длл
h:= LoadLibrary('Project2.Dll');
затем получаю картинку
imageStream:=TResourceStream.Create(h,'BB',RT_BITMAP);

и на этом месте вылетает ошибка связанная с памятью...
image1.Picture.Graphic.LoadFromStream(imageStream);


Наверх

Титульная страница Поиск, карта сайта Написать письмо