Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.11.27;
Скачать: CL | DM;

Вниз

ресурсы в длл   Найти похожие ветки 

 
Tim   (2011-08-02 18:25) [0]

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


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

из программы вытаскиваю ресурсы:
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);


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

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


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

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


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


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


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

Спасибо, тогда по-порядку, в папке лежит файл 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

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


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

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


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

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


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

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

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;


Работает.


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


>  Bitmap image is not valid


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

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


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

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

uses
SysUtils,
Classes,
JPEG;

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

begin
end.


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


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

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


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

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:48) [12]


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


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

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


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

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


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

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


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


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

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


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2011.11.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
3-1267379059
Ulugbek
2010-02-28 20:44
2011.11.27
Помогите спроектировать маленькую базу для учета медикаментов.


15-1311859760
Дмитрий С
2011-07-28 17:29
2011.11.27
threadvar


4-1252429299
Дмитрий
2009-09-08 21:01
2011.11.27
Удаление кнопки при ее нажатии


6-1246261879
Strate
2009-06-29 11:51
2011.11.27
Как определить, к какой подсети принадлежит определённый адрес?


2-1312129640
From4pda
2011-07-31 20:27
2011.11.27
выбор диска для копирования