> как я понимаю самы простой способ это > использовать как минимум два фаила > один исполняемый exe a другой другой сама база Таких СУБД уже есть и много. Тот же Embedded MySQL или SQLite. А вот что можно сделать вопросу корневого поста... Насколько я понимаю, основная проблема в том, что исполняемый файл остается залочен. Или нет?
Хм, в принципе у меня появилась идейка... Отдельным постом напишу. Но она предполагает удвоение занимаемого места во время работы.
Есть давняя мечта - сотворить СУБД-ху (в виде библиотеки С++), которая хранила бы все данные прямо в исполняемом файле, не требуя никакихдополнительных файлов данных и ДЛЛ-ок. Типа, переписал ЕХЕ-шник на диск и вот тебе вся база с данными - ничего не потеряется и не перепутается.
Тут уже раз этот вопрос подымали и пришли к выводу, что без специального драйвера в ядре - не выйдет. Но может быть все же придумаем какой-нить путь, чтобы без доп. файлов и инсталляхи?
[Win32] Сенкс всем! Пейте пиво пенное, и будет вам Эврика! 8-)13.11.03 07:47 Автор: Zef <Alloo Zef> Статус: Elderman
Короче, пока доехал до дому, прихлебывая пиво (40 мин. на электричке), осознал, что неправильно ставлю задачу.
Во-первых: База должна только храниться в виде одного файла, но никто не запрещает ей при работе создавать сколько угодно временных.
Во-вторых: Это даже желательно, поскольку исходный ЕХЕ-шник должен сохраняться до конца работы, как резервная копия, на случай некорректного завершения.
В-третьих: Нет нужды писать на ходу именно в запущенный ЕХЕ-шник.
Итак, с учетом вышесказанного, база должна представлять собой самораспаковывающийся - самоупаковывающийся архив.
Наиболее простая организация, не использующая никаких недокументированных возможностей и переносимая на любую платформу выглядит так:
Архив раскручивается в набор файлов в числе которых два исполняемых - собственно прога и "мусорщик - архиватор". По окончании работы прога запускает "мусорщик" и завершается, а тот сворачивает все файлы и обновляет архив, после чего стирает все, кроме себя и архива.
Если прога завершается аварийно, "мусор", естественно, остается, но остается и работоспособный архив. Обнаружив "мусор" архив не затирает его, а пытается сначала подключиться к имеющимся файлам данных и, только в случае, если это не удается, его можно специальной опцией заставить их переписать.
[Win32] В запущенный никак12.11.03 15:03 Автор: amirul <Serge> Статус: The Elderman
> Тут уже раз этот вопрос подымали и пришли к выводу, что без > специального драйвера в ядре - не выйдет. Но может быть > все же придумаем какой-нить путь, чтобы без доп. файлов и > инсталляхи? Но можно уйти в другой процесс, завершить этот и писать в нужный экзешник. Только уходить надо при помощи CreateRemoteThread в nt или dll-injection (или любым другим способом в 9x), чтоб не быть родителем вновь созданного процесса и не умереть при убийстве оного
[Win32] Писать в запущенный EXE-шник?12.11.03 14:59 Автор: Ktirf <Æ Rusakov> Статус: Elderman
В общем, все не так уж удобно, но в качестве затравки может и пойдет...
Запускаем ехешник. Первым движением он копирует себя (может быть, не целиком) в отдельный файл и открывает его на запись. Это БД. По окончании работы эта новая копия получает управление, старый файл удаляется. Все. На диске опять один файл.
Еще раз предупреждаю, это только затравка, наверняка можно сделать лучше.
[Win32] Не лучше все таки освободить этот12.11.03 15:10 Автор: amirul <Serge> Статус: The Elderman
> Еще раз предупреждаю, это только затравка, наверняка можно > сделать лучше. И только потом писать. У меня в принципе где-то валяются наработки по внедрению кода в тот же explorer. Но думаю мне их будет откопать труднее, чем поискать в нете :-)))
[C++] [Win32] Писать в запущенный EXE-шник?12.11.03 14:45 Автор: Tamas Статус: Member
как я понимаю самы простой способ это
использовать как минимум два фаила
один исполняемый exe a другой другой сама база
> Есть давняя мечта - сотворить СУБД-ху (в виде библиотеки > С++), которая хранила бы все данные прямо в исполняемом > файле, не требуя никакихдополнительных файлов данных и > ДЛЛ-ок. Типа, переписал ЕХЕ-шник на диск и вот тебе вся > база с данными - ничего не потеряется и не перепутается. > > Тут уже раз этот вопрос подымали и пришли к выводу, что без > специального драйвера в ядре - не выйдет. Но может быть > все же придумаем какой-нить путь, чтобы без доп. файлов и > инсталляхи?
[C++] Так не интересно.12.11.03 14:55 Автор: Ktirf <Æ Rusakov> Статус: Elderman
> как я понимаю самы простой способ это > использовать как минимум два фаила > один исполняемый exe a другой другой сама база Таких СУБД уже есть и много. Тот же Embedded MySQL или SQLite. А вот что можно сделать вопросу корневого поста... Насколько я понимаю, основная проблема в том, что исполняемый файл остается залочен. Или нет?
Хм, в принципе у меня появилась идейка... Отдельным постом напишу. Но она предполагает удвоение занимаемого места во время работы.