![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ресурсы в длл [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);