Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2012, 18:49   #1
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
Вопрос Загрузка бинарных данных из app::rc {$R *.dres}

Вопрос.
В ресурсах приложения {$R *.dres} с иконками, битмапами, строками… сидит двоичный файл.
Чем или как можно его загрузить в программе? buff := Load***(handle, name)?

время++
кажется разобрался.
Код:
var
  rc : uint32;
  resource : uint32;
  sr : PAnsiChar;
begin
  rc := FindResource(GetModuleHandle(nil),'Resource_1',RT_RCDATA);
  resource := LoadResource(GetModuleHandle(nil), rc);
  sr := PAnsiChar(LockResource(resource));
  writeln(sr);
  FreeResource(resource);
...
end;
Однако остался вопрос, после FreeResource(resource) sr указывает на мусор?

Последний раз редактировалось Warn; 06.05.2012 в 19:49.
Warn вне форума Ответить с цитированием
Старый 07.05.2012, 01:06   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.gunsmoker.ru/2011/11/blog...resourcestream
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.05.2012, 07:13   #3
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Благодарствую, я пробовал использовать TResourceStream однако, программа сразу вылетала, причем, не доходя до места где используется этот самый TResourceStream. Причиной тому я думаю, является то, что я поотключал все пакеты в среде Delphi 2010) поэтому сразу после добавления Classes в uses происходило что-то страшное. Ну и вследствии этой причины написал исключительно на WIN API)

Еще вопрос один по ходу дела возник, если скажем к программе прилинковать ресурсов на 20мб+ в русле эстетических соображений, чтобы куча файлов не валялась рядом с учу.
Запуская такую программу, система будет читать весь объем или только исполняемую часть?
Т.е. вопрос скорее такого плана время загрузки приложения увеличится? Использование оперативной памяти тоже (при условии что мы еще ничего не загружали из ресурсов)?

время++
Проверил приаттачил к программе архив на 25мб время сборки приложения увеличилось, время загрузки не заметил чтобы увеличилось. В диспетчере оба варианта занимали одинаковый объем памяти, что то около 22мб, что вариант с ресурсом(ресурс не грузился) что без него. Может быть размещении ресурсов идет в другом месте(памяти)?

Последний раз редактировалось Warn; 07.05.2012 в 07:37.
Warn вне форума Ответить с цитированием
Старый 07.05.2012, 07:43   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.gunsmoker.ru/2011/04/wind...n-off.html#n10
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.05.2012, 09:50   #5
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
Иными словами, при загрузке процесса, не имеет значения, какого размера будет .exe файл - файл будет лишь спроецирован на адресное пространство, но в физической памяти будет только первая страница кода. Все остальные части будут загружены только по мере обращения кода к ним.
Т.е получается не важно как мы организовали загрузку ресурсов которые используются в учу, будь у нас куча файлов разбросанных с учу которые мы подгружаем когда надо или будь у нас учу с ресурсами внутри. Загрузка (физ)памяти в обоих случаях будет одинаковой, так как загрузка/выгрузка из app::rc тоже происходит по требованию.
Warn вне форума Ответить с цитированием
Старый 09.05.2012, 08:37   #6
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
Вопрос

Столкнулся с такой проблемой.
Загружаю исходники шейдеров(шейдер) из ресурсов программы.
Два ресурса : код вершинного шейдера и фрагментного.
Код процедуры...

Код:
function CShaderProgram.LoadFromResource (const vs : string; const fs : string) : boolean;
label exitonerr;
var
	vs_rc : uint32;
  fs_rc : uint32;
  vs_resource : uint32;
  fs_resource : uint32;
  vs_pointer : pointer;
  fs_pointer : pointer;

  vs_size	: uint32;
  fs_size	: uint32;
  vs_source : PAnsiChar;
  fs_source : PAnsiChar;

begin
	status := 0;
  Result := false;

  // читаем ресурсы
  vs_rc := FindResource(0, PChar(vs), RT_RCDATA);
  if (vs_rc = 0) then exit;

  vs_resource := LoadResource(0, vs_rc);
  vs_pointer := LockResource(vs_resource);
  vs_size := SizeofResource(0, vs_rc);
  vs_source := PAnsiChar(vs_pointer);

  fs_rc := FindResource(0, PChar(fs), RT_RCDATA);

  if (fs_rc = 0) then begin
    FreeResource(vs_resource);
  	exit;
  end;

  fs_resource := LoadResource(0, fs_rc);
  fs_pointer := LockResource(fs_resource);
  fs_size := SizeofResource(0, fs_rc);
	fs_source := PAnsiChar(fs_pointer);

  // компилируем исходники шейдеров
  vsObj := compile_vs_source ( vs_source, vs_size );
  if (vsObj <= 0) then begin
  	Result := false;
    goto exitonerr;
  end;

  fsObj := compile_fs_source ( fs_source, fs_size );
  if (fsObj <= 0) then begin
  	Result := false;
    goto exitonerr;
  end;

  // линкуем программу
  id := link_program(vsObj, fsObj);

  // вызываем у потомков связку локаций
  GetUniformsLocations();
  Result := boolean(status);

exitonerr:
  FreeResource(vs_resource);
  FreeResource(fs_resource);
end;
В результате загрузка и компиляция вершинного проходит нормально, а загрузка фрагментного с ошибкой в рез-те и его компиляция накрывается. Смотрел дебаге что собой представляют данные фрагментного, так там оказываются данные самого фрагментного шейдера + в добавок код вершинного следом.
В чем дело понять не могу
Изображения
Тип файла: jpg debug src screen.jpg (112.0 Кб, 121 просмотров)
Warn вне форума Ответить с цитированием
Старый 09.05.2012, 08:39   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

С чего ты взял, что данные должны иметь терминатор?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2012, 08:50   #8
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
С чего ты взял, что данные должны иметь терминатор?
Я надеялся, на благоразумность толи бракоделов толи мелкомягких))
Но похоже зря и наверное ты в очердной раз прав они там так лежат. null-терминатора нет и вся беда(
т.е. как вариант решения проблемы мне нужно выделять память размером с исходный код + 1 байтъ, обнулить эту память fillchar'ом, и затем копировать туда загруженные данные исходника? Так я получу null-терминатор в конце, или можно проще?
Warn вне форума Ответить с цитированием
Старый 09.05.2012, 09:01   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Нет тут никакой проблемы, ты её выдумал. Отсутствие терминатора - это как раз и есть разумное и правильное решение. Почему? Потому что он не нужен и даже вреден. Почему? Да по той простой причине, что все размеры ты контролируешь явно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2012, 11:01   #10
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
Отсутствие терминатора - это как раз и есть разумное и правильное решение
Понятно, спасибо)
Warn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись бинарных данных в TStream retroguy Общие вопросы Delphi 10 24.04.2012 22:03
TreeView-загрузка данных r1ga WPF, UWP, WinRT, XAML 2 09.04.2012 21:08
Конвертер бинарных данных royun Общие вопросы Delphi 5 30.08.2011 11:50
Передача данных из VC++ DLL в Delphi App Kosoglaz Общие вопросы C/C++ 2 05.02.2008 10:53
Загрузка данных AlexMori Общие вопросы Delphi 2 15.11.2007 08:12