Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  23:05[Войти] | [Зарегистрироваться]
Ответ на вопрос № 43568

30-06-2006 04:12
Создание "компилятора" e-book

Возникло у меня тут парочка вопросов по "компиляторам" электронных книг, типа Natata, WebExe и подобных.

Как действуют эти "компиляторы"? Они создают некий "темплейт", т.е. пустышку, exe-файл с компонентом для чтения данных. Затем засоывают в секции или ресурсы этого темплейта данные книги (текст, рисунки и все остальное). Когда запускаешь такую "скомпилированную" книгу, ть данные считываются из секции или ресурсов, и выводятся в компнент-вьювер.

Понятное дело, что из ресурсов текст книги вытащит любой идиот.

Поэтому у меня возник вопрос - как можно реализовать нечто подобное, т.е. запись и чтение из секций?

С PE-форматом я не очень разбираюсь, так что мог и напутать с описанием "компиляции" :)

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

09-09-2006 06:34 | Вопрос к автору: запрос дополнительной информации
ммм. а такой вопрос, как вытащить текст из natata еКниги? чтото до меня пока не доходит =\

01-07-2006 14:14 | Сообщение от автора вопроса
Сам нашел решение проблемы. Спасибо также людям с форума delphimaster.ru :)

Вот код, который работает (и нормальная функция GetImageSize). Возможно, кому-либо он будет полезен:


function GetImageSize(Instance:THandle):Cardinal;
var  Index:Integer;
Header:PImageNtHeaders;
begin
Result:=0;
Inc(Instance,PImageDosHeader(Instance)._lfanew);
Header:=PImageNtHeaders(Instance);
Inc(Instance,SizeOf(TImageNtHeaders));
for Index:=1 to Header.FileHeader.NumberOfSections do begin
  with PImageSectionHeader(Instance)^ do
    if PointerToRawData+SizeOfRawData>Result then
      Result:=PointerToRawData+SizeOfRawData;
  Inc(Instance,SizeOf(TImageSectionHeader));
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
FS: TFileStream;
Buf: PChar;
BufLen: Int64;
ImgSize: Int64;
begin
FS := TFileStream.Create(ParamStr(0),fmOpenRead or fmShareDenyWrite);
ImgSize := GetImageSize(HInstance);
BufLen := FS.Size - ImgSize;
FS.Position := ImgSize;
GetMem(Buf,BufLen);
FS.Read(Buf[0],BufLen);
HTMLViewer1.LoadFromBuffer(buf, buflen);
FS.Free;
end;



Таким образом, во вьювер загружаются все данные от ImageSize до настоящего размера файла.

Но тут у меня возникает еще один вопрос.

Ебук же не будет состоять из одного файла, верно? Нужны картинки, загрузка страниц дополнительных глав...

Здесь, ниже, я уже "изобрел" свою "реализацию" этого. По-моему, она просто бредова :D

Вы можете что-нибудь мне посоветовать?
 

01-07-2006 09:07 | Сообщение от автора вопроса
Кажиь, я действительно полное ламо :))) При компляции выдает следующие ошибки:

 
  HFile:=CreateFile(PChar(ParamStr(0)),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
  if HFile=INVALID_HANDLE_VALUE then Error; //Statement excepted, but expression of type 'Integer' found
  HMap:=CreateFileMapping(HFile,nil,PAGE_READONLY,0,0,nil);
  if HMap=0 then Error; //Statement excepted, but expression of type 'Integer' found
  FSize:=GetFileSize(HFile,nil);
  CloseHandle(HFile);
  FileLength:=GetImageSize(ParamStr(0));
  if (FileLength<=0)or(FileLength>=FSize) then Error; //Statement excepted, but expression of type 'Integer' found
  PImage:=MapViewOfFile(HMap,FILE_MAP_READ,0,0,0);



Вроде бы, где-то на дельфикиндоме был справочник по ошибам?
 

01-07-2006 07:24
Вот, откуда то выдрал, может с MMF вам больше повезёт :)

var
  HFile,HMap:THandle;
  FileLength,FSize:Integer;
  PImage:Pointer;
begin
  HFile:=CreateFile(PChar(ParamStr(0)),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
  if HFile=INVALID_HANDLE_VALUE then Error;
  HMap:=CreateFileMapping(HFile,nil,PAGE_READONLY,0,0,nil);
  if HMap=0 then Error;
  FSize:=GetFileSize(HFile,nil);
  CloseHandle(HFile);
  FileLength:=GetImageSize(ParamStr(0));
  if (FileLength<=0)or(FileLength>=FSize) then Error;
  PImage:=MapViewOfFile(HMap,FILE_MAP_READ,0,0,0);
  //Теперь в PImage содержится то что вы хотели получить в booktxt


01-07-2006 07:13
Если исправить Create, то всё нормально работает, так что зря новый вопрос задавали. А вот функция GetFileSize из вопроса 42523 не работает, а почему можно понять из очередного оффтопика http://www.delphikingdom.com/help/help_offtopic.asp?ID=49#off49 Впрочем вам эта функция вообще не нужна, так как у TFileStream есть свойство Size.

30-06-2006 14:52
Или я действительно идиот, или полный ламос :)
Даже не знаю что на это сказать, но возможно стоит посмотреть сюда http://www.delphikingdom.com/help/help_offtopic.asp?ID=29#off29

30-06-2006 12:35 | Сообщение от автора вопроса
>> Правильнее всё таки

Или я действительно идиот, или полный ламос :)

Делаю вот так:
  img := GetImageSize(Application.ExeName);
  fs := GetFileSize(Application.ExeName);
  bookdata := fs-img; //размер книжных данных
  BookFile.Create(Application.ExeName, fmOpenRead or fmShareDenyWrite);
  BookFile.Seek(img, soFromBeginning);
  BookFile.Read(booktxt, bookdata);

При запуске выдает Acces Violation at address xxxxxxxx. Write of address xxxxxxxx.

На всякий случай - img, fs, bookdata: Cardinal;

>> Угу, на офф сайте в разделе Purchase http://www.pbear.com/prof.html

Все-таки нашел, на форуме sources.ru :)
 

30-06-2006 11:44
Правильнее всё таки "TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyWrite);".
Где нибудь пожно достать проф. и с сырцами?
Угу, на офф сайте в разделе Purchase http://www.pbear.com/prof.html

30-06-2006 11:04 | Сообщение от автора вопроса
>> FileStream.Create(FileName, fmOpenRead)

Нет

>> TFileStream.Create(FileName, fmShareDenyNone)

Попробую...

Профессиональная версия THtmlViewer на официальном сайте платная, а lite - урезанная, и без исходников... Где нибудь пожно достать проф. и с сырцами?
 

30-06-2006 10:14
а че TFileStream.Create(FileName, fmOpenRead) не катит или
TFileStream.Create(FileName, fmShareDenyNone) ???

HTML-viewer

http://www.pbear.com/

30-06-2006 10:01 | Сообщение от автора вопроса
Блин, нигде не могу найти нормальный THtmlViewer с исходниками - везде ссылки битые. Может, кто-нибудь поделится?

Да, и опять по чтению из собственного файла - что-то у меня и с API ничего не получается - ошибки при чтении. Знающие люди, подскажите мне, ламосу, как это нормально реализовать :)
 

30-06-2006 09:26
Попробуй THTMLViewer вроде у него есть возможность (возможно сторонняя) для отрисовки в метафайл, и наверное лучше выводить книги как это делает Acrobat Reader когда запрещает возможность копирования текста.

30-06-2006 09:03 | Сообщение от автора вопроса
>> И где будет храниться пароль для дешифровки? Или он вообще будет один на >> все книжки? Определитесь что вам надо, потому что перечисленные вами
>> Natata и WebExe ничего не шифруют и хранят данные так как я сказал, в
>> конце файла. Natata (глючная прога, только на одном компе удалось
>> запустить) использует для "защиты" zlib сжатие, а WebExe вообще
>> приклеивает обычный ZIP-архив.

Пароль для расшифровки будет пользователь вводить. Если правильный - то расшифруется, если нет - то нет. Вообще, я шифровку, ключи и подобное сделаю потом - сейчас только сам темплейт и "компилятор".

И вот еще несколько вопросов:

1) Используя TFileStream, из самого себя считать ничего не получается - ошибочки. Использовать API?

2) Как осуществлять навигацию? Я планирую делать так - отлавливать каким-либо образом нажатие ссылки во вьювере, искать метку файла, который надо подгрузить, и все до следующей метки загружать во вьювер. По-моему, мой способ бредовый :) Что-нибудь получше можете предложить?

3) А как быть с изображениями, и подобным? Что-то у меня сегодня мозги вообще не варят. Привет мне, ламосу :)

4) Есть ли какая-нибудь замена TWebBrowser, желательно с исходниками? Ведь из TWebBrowser очень легко вытянуть html-сорц...
 

30-06-2006 07:34
но я недогоняю - зачем мне размер экзешника без оверлеев?
Чтобы знать откуда начинаются эти оверлеи. Другой способ, использовать "footer" который находится в самом конце файла и в котором хранится размер данных.
Я планировал шифровать :)
И где будет храниться пароль для дешифровки? Или он вообще будет один на все книжки? Определитесь что вам надо, потому что перечисленные вами Natata и WebExe ничего не шифруют и хранят данные так как я сказал, в конце файла. Natata (глючная прога, только на одном компе удалось запустить) использует для "защиты" zlib сжатие, а WebExe вообще приклеивает обычный ZIP-архив.

30-06-2006 06:10
Я планировал шифровать :)

Да но для отображения вам все равно пришлось бы расшифровать и поставленный хук принял бы нормальный нешифрованный текст :)

Слушайте DRONа - он знает, что говорит.

30-06-2006 06:07 | Сообщение от автора вопроса
>> Если будете хранить текст в открытом виде, то "любой идиот" вытащит не только >> из ресурсов. Обычно от текста полностью избавляются (иначе просто ставим хук >> на какой нибудь DrawText и вытаскиваем построчно всю книгу) и хранят
>> изображения букв и слогов, которые потом выводят в нужном порядке.

Я планировал шифровать :)
 

30-06-2006 06:05 | Сообщение от автора вопроса
Может быть, у меня это из-за жуткой жары (на юге живу ;), но я недогоняю - зачем мне размер экзешника без оверлеев? :D

P.S.: пошел за пивом, охаждаться :)
 

30-06-2006 05:07
Как действуют эти "компиляторы"? Они создают некий "темплейт", т.е. пустышку, exe-файл с компонентом для чтения данных.
Да, именно так.
Затем засоывают в секции или ресурсы этого темплейта данные книги (текст, рисунки и все остальное).
Обычно не так, данные просто добавляются в конец файла, такой же метод используют все архиваторы, когда создают самораспаковывающийся архив.
Как узнать размер EXE-шника (без данных) из него самого написано тут:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=42523
Понятное дело, что из ресурсов текст книги вытащит любой идиот.
Если будете хранить текст в открытом виде, то "любой идиот" вытащит не только из ресурсов. Обычно от текста полностью избавляются (иначе просто ставим хук на какой нибудь DrawText и вытаскиваем построчно всю книгу) и хранят изображения букв и слогов, которые потом выводят в нужном порядке.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жил-был у бабушки серенький КТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования