Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 755

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
мне необходимо преклеить к ехешнику картинки в формате jpeg
создаю файл ресурсов
1 RCDATA "CLOSE1.jpg"
2 RCDATA "CLOSE2.jpg"
3 RCDATA "PLAY1.jpg"
4 RCDATA "PLAY2.jpg"
5 RCDATA "README1.jpg"
6 RCDATA "README2.jpg"
7 RCDATA "SETUP1.jpg"
8 RCDATA "SETUP2.jpg"
9 RCDATA "DELETE1.jpg"
10 RCDATA "DELETE2.jpg"
11 RCDATA "MINIM1.jpg"
12 RCDATA "MINIM2.jpg"
13 RCDATA "FON.JPG"
14 PCWAVE "LEVEL.WAV"
файл компилится без ошибок
далее подключаю файл ресурсов
{$R ishodnik.RES}
опять же без ошибок
объявляю
CLOSE1,CLOSE2,
PLAY1,PLAY2,
README1,README2,
SETUP1,SETUP2,
DELETE1,DELETE2,
MINIM1,MINIM2,
FON: TJPEGImage;
ResStream: TResourceStream;
далее
procedure TForm1.FormCreate(Sender: TObject);
const levo=6;plus=56;
begin
ResStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
close1:=TJPEGImage.Create;close1.loadfromstream(ResStream);
close2:=TJPEGImage.Create;close2.loadfromstream(ResStream);
PLAY1:=TJPEGImage.Create;
PLAY2:=TJPEGImage.Create;
PLAY1.loadfromstream(ResStream);
PLAY2.loadfromstream(ResStream);
fon.picture.Assign(play2);....при запуске ошибка
Project autorun.exe raised exception class EJPEG with
message 'JPEG error #42'. Ну и тд..
Подскажите, пожалуйста, что делать. Если считываю только первую картинку, то всё верно, никаких ошибок, начинаю считывать последующие-беда :(

red_88 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: red_88 (статус: Посетитель)
Вопрос отправлен: 7 июля 2008, 18:48
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, red_88!
Нуууу вооотт... опять двадцать пять... Это ж тема уже не однократно тут подымалась, неужели нельзя поиском польлзоваться.
Сначала ознакомтся с Вопросами вопрос #920, вопрос #855, вопрос #478. Судя по вашему коду, вы одну и туже картинку грузите в ResStream. Может тут и проблема ? Или может помтоу, что вы не указали имена ресурсов в файле .rc ? Для проверки, правильно ли загрузилась картинка из ресурса в поток, выполните что-то вроде TResourceStream.SaveToFile и проверьте полученный файл. И не забывайте, что после подключения {$R ishodnik.RES} проект надо обязательно полностью перебилдить, а не провто компилировать.

Желаю удачи.

Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 7 июля 2008, 19:12
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 20; последнее сообщение — 11 июля 2008, 00:58; участников в обсуждении: 4.
red_88

red_88 (статус: Посетитель), 8 июля 2008, 12:42 [#1]:

//Или может помтоу, что вы не указали имена ресурсов в файле .rc ?
а как их указывать? у меня порядковые номера первым пунктом в строке, заменил их на j+номер, таже ошибка. фпоиске был, выкачал делфиворлд, там нет ничего по тому, как из одного ресурса подключать несколько файлов, по возможности разнотипных
// Для проверки,
да и так видно, что ошибка. он считывает только первый файл, а дальше никак
//обязательно полностью перебилдить, а не провто компилировать
размер ехешника вырос на размер файла ресурсов, думаю, оно
Матвеев Игорь Владимирович

Матвеев Игорь Владимирович (статус: Студент), 8 июля 2008, 23:27 [#2]:

ResStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
close1:=TJPEGImage.Create;close1.loadfromstream(ResStream);
close2:=TJPEGImage.Create;close2.loadfromstream(ResStream);

Вы загружаете в ResStream одно изображение, затем считываете его, а потом пытаетесь считать из того-же потока следующее изображение!

Пропробуйте к примеру:
RS1 := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA);
close1:=TJPEGImage.Create;close1.loadfromstream(RS1);
RS2 := TResourceStream.CreateFromID(HInstance, 2, RT_RCDATA);
close2:=TJPEGImage.Create;close2.loadfromstream(RS2);
Feniks

Feniks (статус: Бакалавр), 9 июля 2008, 10:07 [#3]:

Вот пример моего файла:
BackGround0 BITMAP "BackGround0.bmp"
BackGround1 BITMAP "BackGround1.bmp"
BackGround2 BITMAP "BackGround2.bmp"
BackGround3 BITMAP "BackGround3.bmp"
BackGround4 BITMAP "BackGround4.bmp"
BackGround5 BITMAP "BackGround5.bmp"
BackGround6 BITMAP "BackGround6.bmp"
BackGround7 BITMAP "BackGround7.bmp"
BackGround8 BITMAP "BackGround8.bmp"
BackGround9 BITMAP "BackGround9.bmp"
BackGround10 BITMAP "BackGround10.bmp"
BackGround11 BITMAP "BackGround11.bmp"
BackGround12 BITMAP "BackGround12.bmp"
BackGround13 BITMAP "BackGround13.bmp"
SoundAbout WAVE "About.wav"
CurSQLWait RCDATA "SQLWait.ani"

И как я с ним работал:
NaladkaDLL := LoadLibrary(PChar(UtilsDll)); // подключаем DLL в которой эти ресурсы
      tmpCurFile := GetTempFile;
      CurResStream := TResourceStream.Create(NaladkaDLL, 'CurSQLWait', RT_RCDATA);
      CurResStream.SaveToFile(tmpCurFile);
      CurResStream.Free;
 
      Screen.Cursors[crSQLWait] := LoadImage(0, PChar(tmpCurFile), IMAGE_CURSOR, 
                                                   0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
 
      bmpBackGround := TBitMap.Create; {Создаем объект TBitMap}
      bmpBackGround.LoadFromResourceName(NaladkaDLL,
                                         'BackGround' +
                                         IntToStr(Random(14))); {Загружаем в него изображение}
      ControlBar.Picture.Bitmap.LoadFromResourceName(NaladkaDLL,
                                         'BackGround' +
                                         IntToStr(Random(14))); {Загружаем в него изображение}
      FreeLibrary(NaladkaDLL);
red_88

red_88 (статус: Посетитель), 9 июля 2008, 11:00 [#4]:

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

Feniks (статус: Бакалавр), 9 июля 2008, 11:59 [#5]:

В DLL запихайте, потом можно PSPack-ом и/или PSProtect-ом пройтися. Ну или чем-нибудь похожим.
red_88

red_88 (статус: Посетитель), 9 июля 2008, 13:30 [#6]:

а можно поподробнее чуток, а то гугл такую кучу фигни выдаёт по
PSPack и PSProtect кучу всего, а про юзание длл для хранения ресурсов статей не нашёл вообще...
Feniks

Feniks (статус: Бакалавр), 9 июля 2008, 13:57 [#7]:

Пардон, опечатался...
ASPack и ASProtect.
red_88

red_88 (статус: Посетитель), 9 июля 2008, 14:00 [#8]:

понял, спасибо, так уже лучше, чтото гуглица....а вот как всё таки с длл не понятно....
Feniks

Feniks (статус: Бакалавр), 9 июля 2008, 14:13 [#9]:

ну а что тут не понятного.
делаете ДЛЛ, и в ней линкуете свой ресурс. Билдите проект ДЛЛ. Получаете готовую ДЛЛ. А в своем проекте ей пользуетесь, как я показал в примере.
DLLHandle := LoadLibrary(PChar('имя файла DLL')); // подключаем DLL в которой эти ресурсы
// далее что-то типа
ResStream := TResourceStream.Create(DLLHandle, 'имя ресурса в .rc файле', RT_RCDATA);
тут уже надо хелп читать, как с этими функциями работать, в зависимости от ваши потребностях... ;-)
Вадим К

Вадим К (статус: Академик), 9 июля 2008, 22:31 [#10]:

Feniks, что за детская наивность, что упаковщик поможет скрыть ресурсы? Многие с них ресурсы просто не упаковывают. А иконки вообще не трогают часто. Почему? можно просто огрести кучку проблем.
С другой стороны сами ресурсы легко вытягиваются с сдампленного файла. роботы на пару минут.
С другой стороны упакованные файлы несут кучу проблем (например, ОС не может свопить приложение как положенно с памяти, ей приходиться занимать место в свопе. А в случае обычного exe/dll можно в своп не бросать - ведь файл есть на диске и можно оттудова подгрузить. Именно по этому и нельзя удалить файл, если программа запущена. и именно по этой причине программы с большим кол-вом ресурсов не грузятся в память полностью. они просто "проэцируются в память" и подгружаются по мере надобности. Если ресурс не использовался, то скорее всего он и не будет подгружаться).
Галочка "подтверждения прочтения" - вселенское зло.
red_88

red_88 (статус: Посетитель), 10 июля 2008, 14:00 [#11]:

те если я только подключаю длл подобно тому, как написал Feniks, то в память ресурсы не грузятся до тех пор, пока я их не подгружу сам?
Вадим К

Вадим К (статус: Академик), 10 июля 2008, 14:20 [#12]:

будь статическая, будь динамическая подгрузка длл, всё равно процес остаётся таким же.
Если даже длл занимает 100мб ("о ужос!"), то будет подгруженно несколько десятков килобайт стартового кода. Остальное будет подгружаться по мере надобности. Но будет "зарезервировано адресное пространство" на 100мб. так как каждому приложению выдаётся 2 гига (на серверных вариантах 3) памяти под его потребности, то всё нормально. Это не физическая память, это виртуальная, её можно тратить в таких пределах. и она небудет сбрасываться в своп - просто будет замещаться. Учитывая, что скорость записи значительно ниже чтения - прирост заметен.

В случае динамической подгрузки длл при её выгрузке память будет освобождаться и "отрезервироваться" - занимаемое адресное пространство будет освобожденно.
Учитывая всё вышесказанное, рекомендую разбить ресурсы на 2-3 файла. В первый - наиболее употребляемые ресурсы и грузить можно статически. в две другие - менее употребляемые.
Галочка "подтверждения прочтения" - вселенское зло.
red_88

red_88 (статус: Посетитель), 10 июля 2008, 15:43 [#13]:

Спасибо, как раз то, что нужно! Только вопрос, где можно почитать про основы работы с dll, чтобы глупых вопросов поменьше задавать? Поиск только разные проблемы выдаёт...а то я даже разницы между статической и динамической подгрузкой не понимаю.. :(
Вадим К

Вадим К (статус: Академик), 10 июля 2008, 16:08 [#14]:

О dll, да и вообще о работе Windows рекомендую почитать Рихтера. В гугле находиться книга:).
при статической загрузке длл в память подгружает загрузчик windows в тот момент, когда загружается приложение. и выгружает по окончанию. То есть длл будет загружена до начала выполнения любого кода (ну почти любого). Если длл не была найдена - приложение загрузить не получиться.
В случае динамической загрузки программист сам решает, когда подгрузить длл и как обработать ситуацию, когда её нет, она поврежденна или не соответствует нужной. Логично, что и выгрузить может тогда, когда хочет. Также можно проверять, есть или нет определённые функции и вызывать их. В случае статической загрузки если какая то функция не будет найдена в длл, то загрузить приложение не удастся.
Галочка "подтверждения прочтения" - вселенское зло.
red_88

red_88 (статус: Посетитель), 10 июля 2008, 17:15 [#15]:

в теории всё понимается мною, да и рихтера почитывал чтото в общем, у меня вопрос по реализации того и другого способа загрузки библиотек данных именно в делфи, а на формуах обсуждений с конкретикой нет, а faq ов просто не нашёл :( даже в делфиворлд нет
Вадим К

Вадим К (статус: Академик), 10 июля 2008, 17:24 [#16]:

Просто не там и не то ищите. А то что мы (я в частности) даём внятные ответы - мы просто угадываем, что же именно хотите от нас:)
Просто задавайте корректные вопросы и скорее всего будут хорошие ответы. А если ответ вас не устраивает, это ещё не значит что он плохой и неверный. Может просто недостигли нужного уровня.
Галочка "подтверждения прочтения" - вселенское зло.
red_88

red_88 (статус: Посетитель), 10 июля 2008, 18:07 [#17]:

Если бы я достиг нужного, то не спрашивал бы, а отвечал :) А конкретно мне надо примера для чайников по работе с DLL в делфях с разными типами загрузки, различным содержимым и тд
Вадим К

Вадим К (статус: Академик), 10 июля 2008, 18:11 [#18]:

Очень пространственный вопрос.
Типов загрузки два - статический и динамический, оба уже описаны.
а различное содержимое - это ресурсы? тогда к длл это имеет весьма опосредственное отношение, впрочем, как и к делфи.
Галочка "подтверждения прочтения" - вселенское зло.
red_88

red_88 (статус: Посетитель), 10 июля 2008, 22:13 [#19]:

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

Вадим К (статус: Академик), 11 июля 2008, 00:58 [#20]:

Ну так месяц, а в дебри лезим!
динамически - если через LoadLibrary
статически - это когда есть объявление
function foo(bar:integer); external 'mydll.dll' name 'foo';
естественно, что можно длл использовать и для статической, так и для динамической загрузки.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.05 сек.