Форум: "Начинающим";
Текущий архив: 2011.11.27;
Скачать: [xml.tar.bz2];
Внизресурсы в длл Найти похожие ветки
← →
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.rcBIRTHDAYSIGN BITMAP "BirthdaySign.bmp"
в проекте dlllibrary 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c