| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Отображение Exe файла в память |
| Автор: Zorlag 30.12.2003, 01:20 |
| Уважаемые программтсты! У меня такая ситуация: мне необходимо чтобы Exe файл моей программы, копировал сам себя в память ( если я не ошибаюсь, это делается с помощью потока??) И из этого отображённого файла нужно прочитать определённую строку. Подскажите, пожалуйста, возможно ли это, и если возможно, то дайте пожалуйста пример кода. Спасибо. |
| Автор: oleg1973 30.12.2003, 01:55 |
| ну так если твой ехе запушен он уже в памяти куда ты хочеш его еще копировать? читай любую строку скока хош |
| Автор: p0s0l 30.12.2003, 09:36 |
| GetModuleHandle(nil) - базовый адрес EXE... Уточни, что ты имеешь в виду, под чтением определенной строки... |
| Автор: Zorlag 30.12.2003, 14:55 |
| Я хочу в конец EXE файла добавть текстовую строку, а потом, когда этот файл будет запущен, мне нужно, чтобы он сам из себя прочитал эту строку. |
| Автор: Zorlag 30.12.2003, 15:04 |
| Oleg 1973 А как мне из него строку-то прочитать?? Я делаю так: var f:text; s:string; begin assignfile (f, application.exename); reset (f); for i:= 1 to 10 do begin read (f, s[i]); {здесь тоько пример. На самом деле мне нужно прочитать строку из конца файла} end; close (f); end. При этом, конечно возникает ошибка доступа к файлу! |
| Автор: NiJazz 30.12.2003, 16:27 | ||
|
| Автор: Seti 30.12.2003, 18:26 | ||||
Замечания: 1)f : TextFile; 2)CloseFile(f); 3)Ошибка возникает из-за того, что ты пытаешься запихнуть символ в s[i], в то время как длина этой строки равна нулю. |
| Автор: Unregistered 30.12.2003, 18:29 |
| Например, мона сделать CopyMemory(); Тока тута надо всеж знать адрес памяти, откуда читать. |
| Автор: Zorlag 30.12.2003, 19:21 |
| Seti А как сделать что-то типа Seek -- чтобы программа читала не с самого начала, а из определённого места файла?? |
| Автор: oleg1973 30.12.2003, 19:25 |
| 1) ну сам к себе строку добавить немнога проблематично будет при открытом файле 2) ну а если прочитать строку из самого себя то достаточно знать ее смешение в файле и если подумать логически то она уже прочитана так как уже в памяти так что если ее нада передать в качестве параметра (ну для мессаджебокса к примеру) то просто укажи смешение на нее |
| Автор: Zorlag 30.12.2003, 19:34 |
| oleg1973 Если можно, можно чуть подробнее о том, что такое смешение? |
| Автор: oleg1973 30.12.2003, 19:37 |
| ну строка у тебя гдето есть в файле? если к примеру файл 10кб а строка от начала файла 100байт вот оно и будет смещением |
| Автор: Смайлик 30.12.2003, 20:13 |
| В принципе в RxLib есть StringHolder (кажется так обзывается) для хранения текстовых строк в файле. Насколько помню через ресурсы и не в конце файла, но может он подойдет? |
| Автор: Zorlag 30.12.2003, 20:20 |
| oleg1973 А как реализовать это смещение -- ведь seek для текстового файла не подходит! |
| Автор: Смайлик 30.12.2003, 20:24 | ||
Можно F: File of byte; тогда seek пашет |
| Автор: Unregistered 30.12.2003, 20:27 | ||
а разве у тебя техтовый файл?
и зачем вообще там seek? если у тебя есть некая переменная А="Хело ворд!" тыж можеш сделать указательна нее? к примеру В тода будет MessageBoxA (0,B,B,0) |
| Автор: Zorlag 30.12.2003, 20:34 |
| Нет, мне нужна именно строка, которая будет "приписана к файлу" уже после его компиляции |
| Автор: Seti 30.12.2003, 20:53 | ||
| Zorlag Считывай строчку с помощью BlockRead Как пользоваться посмотри в хелпе. По смещению где находится строчка (не ресурс) сначала 4 байта, указывающие на длину строки причем сначала идет младший байт), затем сама строчка. То есть если по заданному смещению стоят байты a1,a2,a3,a4, то длина строки a1+a2*256+a3*256*256+a4*256*256*256. Это в том случае, при компилировании строчка указана в виде константы
Если откомпилировать этот исходник, в exe будут строчки 'MyString1' и 'MyString3' 'MyString2' закодируется по хитрому, его не найдешь. |
| Автор: p0s0l 30.12.2003, 23:54 | ||||
Тогда делай так:
Только условие: перед приписываемой строчкой должен быть хотя бы один нулевой байт - чтобы отделить сам EXE от этой строки. |