Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Отображение Exe файла в память


Автор: Zorlag 30.12.2003, 01:20
Уважаемые программтсты! У меня такая ситуация:
мне необходимо чтобы Exe файл моей программы, копировал сам себя в память ( если я не ошибаюсь, это делается с помощью потока??)
И из этого отображённого файла нужно прочитать определённую строку. Подскажите, пожалуйста, возможно ли это, и если возможно, то дайте пожалуйста пример кода. Спасибо.

Автор: oleg1973 30.12.2003, 01:55
ну так если твой ехе запушен он уже в памяти
куда ты хочеш его еще копировать?
читай любую строку скока хош smile.gif

Автор: 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
Цитата
читай любую строку скока хош 

smile.gif

Автор: Seti 30.12.2003, 18:26
Цитата
Код

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.



Замечания:
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) ну а если прочитать строку из самого себя то достаточно знать ее смешение в файле
и если подумать логически то она уже прочитана так как уже в памяти smile.gif
так что если ее нада передать в качестве параметра (ну для мессаджебокса к примеру) то просто укажи смешение на нее

Автор: 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
Цитата
А как реализовать это смещение -- ведь seek для текстового файла не подходит!

Можно

F: File of byte;

тогда seek пашет

Автор: Unregistered 30.12.2003, 20:27
а разве у тебя техтовый файл?
Цитата
мне необходимо чтобы Exe файл моей программы

и зачем вообще там 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.
Это в том случае, при компилировании строчка указана в виде константы
Код

const
 MyString1 = 'MyStrign1';
resourcestring
 MyString2 = 'MyString2';
begin
 Writeln('MyString3')
end.


Если откомпилировать этот исходник, в exe будут строчки 'MyString1' и 'MyString3'
'MyString2' закодируется по хитрому, его не найдешь.

Автор: p0s0l 30.12.2003, 23:54
Цитата
Нет, мне нужна именно строка, которая будет "приписана к файлу" уже после его компиляции

Тогда делай так:
Код
var
 f : integer;
 c : char;
 s : string;
begin
 f := FileOpen(Application.ExeName, fmOpenRead + fmShareDenyNone);
 FileSeek (f, 0, 2); // End Of File
 FileSeek (f, -1, 1); // Переход на предпоследний байт
 s := '';
 repeat
   FileRead (f, c, 1);
   if c = #0 then Break;
   s := c + s;
   FileSeek (f, -2, 1);
 until False;
 FileClose(f);
// в s теперь сидит нужная тебе строка
end;

Только условие: перед приписываемой строчкой должен быть хотя бы один нулевой байт - чтобы отделить сам EXE от этой строки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)