Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
2-1312799819
А
2011-08-08 14:36
2011.11.27
mysql zoesdb нет коннекта


15-1310580284
Leon-Z
2011-07-13 22:04
2011.11.27
Любимая детская сказка.


3-1265182852
Гость
2010-02-03 10:40
2011.11.27
Аудит триггером составной транзакции


3-1267604511
DenProx
2010-03-03 11:21
2011.11.27
Фильтрация Loockup поля


15-1312316995
Юрий
2011-08-03 00:29
2011.11.27
С днем рождения ! 3 августа 2011 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский