Возникло у меня тут парочка вопросов по "компиляторам" электронных книг, типа Natata, WebExe и подобных.
Как действуют эти "компиляторы"? Они создают некий "темплейт", т.е. пустышку, exe-файл с компонентом для чтения данных. Затем засоывают в секции или ресурсы этого темплейта данные книги (текст, рисунки и все остальное). Когда запускаешь такую "скомпилированную" книгу, ть данные считываются из секции или ресурсов, и выводятся в компнент-вьювер.
Понятное дело, что из ресурсов текст книги вытащит любой идиот.
Поэтому у меня возник вопрос - как можно реализовать нечто подобное, т.е. запись и чтение из секций?
С PE-форматом я не очень разбираюсь, так что мог и напутать с описанием "компиляции" :)
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
09-09-2006 06:34 | Вопрос к автору: запрос дополнительной информации
ммм. а такой вопрос, как вытащить текст из natata еКниги? чтото до меня пока не доходит =\
Сам нашел решение проблемы. Спасибо также людям с форума 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;
Таким образом, во вьювер загружаются все данные от 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
Если исправить Create, то всё нормально работает, так что зря новый вопрос задавали. А вот функция GetFileSize из вопроса 42523 не работает, а почему можно понять из очередного оффтопика http://www.delphikingdom.com/help/help_offtopic.asp?ID=49#off49 Впрочем вам эта функция вообще не нужна, так как у TFileStream есть свойство Size.
Правильнее всё таки "TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyWrite);".
Где нибудь пожно достать проф. и с сырцами?
Угу, на офф сайте в разделе Purchase http://www.pbear.com/prof.html
Блин, нигде не могу найти нормальный THtmlViewer с исходниками - везде ссылки битые. Может, кто-нибудь поделится?
Да, и опять по чтению из собственного файла - что-то у меня и с API ничего не получается - ошибки при чтении. Знающие люди, подскажите мне, ламосу, как это нормально реализовать :)
30-06-2006 09:26
Попробуй THTMLViewer вроде у него есть возможность (возможно сторонняя) для отрисовки в метафайл, и наверное лучше выводить книги как это делает Acrobat Reader когда запрещает возможность копирования текста.
>> И где будет храниться пароль для дешифровки? Или он вообще будет один на >> все книжки? Определитесь что вам надо, потому что перечисленные вами
>> 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-архив.
>> Если будете хранить текст в открытом виде, то "любой идиот" вытащит не только >> из ресурсов. Обычно от текста полностью избавляются (иначе просто ставим хук >> на какой нибудь 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 и вытаскиваем построчно всю книгу) и хранят изображения букв и слогов, которые потом выводят в нужном порядке.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.