Прошу помочь мне разобратся с использованием ресурсов (TResourceStream).
Мне нужно загрузить в программу HLP и CNT файлы (справка). И если пользователь произвел выборочную установку программы (без справки), то при необходимости предоставить такую возможность когда это будет необходимо.
Вот только ничего у меня не выходит:(
Добавляю файлы так: Project->Resourses->New->User data.
Далее пытаюсь их извлечь:
function TMain.ExtractRes(ResType, ResName, ResNewName : String) : Boolean;
var
Res : TResourceStream;
begin
{
ResType - тип
ResName - имя файла
ResNewName - в какой файл извлечь
}
Res:=TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
И все! Вылетают ошибки о том, что ресурс не найден. Хотя в инспекторе ресурсов он отображается под таким именем. Или я что-то не правильно понимаю?
Надеюсь на Вашу помощь!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
31-08-2009 13:09 | Комментарий к предыдущим ответам
>>> в какой функции API можно использовать YourPointer
Ни в какой. В большинстве случаев можно только сохранить файл на диск. Если ОЧЕНЬ много предлагают - писать драйвер виртуальной файловой системы. Приложению передавать ссылку на файл виртуальной ФС, а драйвер разберется, что читать данные надо из памяти.
22-08-2009 00:47 | Комментарий к предыдущим ответам
Если извлекать на диск не хотите, то получаете хэндл ресурса, указатель на него и используйте:
h:=FindResource(hInstance, 'DOO_EXE', EXEFILE);
if h<>0 then begin
h:=LoadResource(hInstance, h);
if h<>0 then begin
YourPointer:=LockResource(h);
//используете адрес YourPointer...
UnlockResource(h);
FreeResource(h);
end;
end;
У меня такой вопрос: в какой функции API можно использовать YourPointer для открытия файла (файл имеет расширение PDF).
>>> при необходимости предоставить такую возможность когда это будет необходимо
У всех нормальных инсталляторов есть возможность доустановки новых компонентов. Я писал на Inno Setup скрипт, который не только добавлял новые группы, но и был способен удалять группы, с которых было снято выделение.
А то, что размер Вашего exe увеличится на Help, ничего? Итак, если не используете Resources Workshop или что-то подобное, то всё делаем руками:
1. В блокноте пишите скрипт:
HELP_FOO_1 RCDATA C:\ProjectPath\RES\help.hlp
HELP_FOO_2 RCDATA C:\ProjectPath\RES\help.cnt
DOO_EXE EXEFILE C:\Borland\Project1.exe
2. Сохраняете в файл (типа myhelpres.rc);
3. Компилируете *.res, в ($DELPHI)\BIN есть утилита-компилятор 32_ресурсов BRCC32.EXE (с командной строкой знакомы?), и получаете файл myhelpres.res;
4. в проекте - {$R myhelpres.res}
5. Извлечение:
procedure InvokeUserHelp(_type, _name, _NewFileName : string);
var res : TResourceStream;
begin
res := TResourceStream.Create(hInstance, _name, PChar(_type));
res.SaveToFile(NewFileName);
res.Free;
end;
procedure TForm1.btnNeedHelpClick(Sender: TObject);
begin
//извлекаем в текущий каталог
ExtractRes('RCDATA', 'HELP_FOO_1', 'help.hlp');
ExtractRes('RCDATA', 'HELP_FOO_2', 'help.hlp');
end;
Если извлекать на диск не хотите, то получаете хэндл ресурса, указатель на него и используйте:
h:=FindResource(hInstance, 'DOO_EXE', EXEFILE);
if h<>0 then begin
h:=LoadResource(hInstance, h);
if h<>0 then begin
YourPointer:=LockResource(h);
//используете адрес YourPointer...
UnlockResource(h);
FreeResource(h);
end;
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.