Главная страница
    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.48 MB
Время: 0.006 c
15-1308125701
Дмитрий С
2011-06-15 12:15
2011.11.27
Быстрый поиск слова по маске.


2-1312473305
rodionov_uv
2011-08-04 19:55
2011.11.27
приём и отправка факса


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


15-1312562196
NailMan
2011-08-05 20:36
2011.11.27
Как я стал мультитриллионером


2-1312799819
А
2011-08-08 14:36
2011.11.27
mysql zoesdb нет коннекта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский